HISTORY

HISTORY([field])

A field's value as of each update of the schedule, from the first saved update to today: a level over time, which holds each update's value from that update's data date until the next. HISTORY makes no unit conversion of its own, so a duration must say how it is counted: HISTORY(INDAYS([Remaining duration])), never HISTORY([Remaining duration]).

Arguments

ArgumentWhat to give it
[field]A number, duration or date field of the row, in brackets: built-in, attribute or formula column. A duration wrapped in INDAYS or INHOURS. Or a field of the one row a relation reaches, such as Task[% complete] on an assignment. Text fields are refused.

What each kind gives:

FieldHISTORY gives
A number, or a duration counted in days or hoursA level over time. Read it with AT, MAX, MIN, AVERAGE or CHANGE.
A dateA date over time: the date as it was forecast at each update. Read it with AT, MAX or MIN.

A blank in an update stays blank until a later update has a value; the earlier value isn't carried forward. Rows line up across updates by key: a task by its code, an assignment by its task's code and its resource. A row an update didn't have has no value there: an assignment added since is blank before the update that added it (AT there is blank, not its first value).

Examples

Formula
=WORKDAYS(MIN(HISTORY([Finish date])), [Finish date])

How far the task's finish has slipped from the earliest finish it was ever forecast for.

Formula
=MAX(HISTORY(INDAYS([Remaining duration])))

The most remaining work the task has had at any update, in days of its own calendar.

Formula
=CHANGE(HISTORY([% complete]), [Actual start])

The progress made between each update and the one before, as an amount over time: the task's earned progress, period by period.

Formula on assignments
=HISTORY(Task[% complete])

On an assignment: its task's progress as of each update.

Measure (on the project)
=WORKDAYS(MIN(HISTORY([Finish date])), [Finish date])

As a measure: how far the project finish has moved from its best forecast.

Reach for something else when

You wantUse
A field in one saved plan, not at every updateBASELINE or SCHEDULE with IN
What was added between updates, from a total to dateCHANGE of the history
Planned work over time, from dates rather than updatesSPREAD

Common questions

Why must I say days or hours for a duration?

The engine won't guess the unit for you. The editor says: "HISTORY counts a duration in days or hours; say which: HISTORY(INDAYS([Remaining duration])) or HISTORY(INHOURS([Remaining duration]))".

The editor refuses this
=HISTORY([Remaining duration])

Can I see how a text field changed, like a phase?

No: “HISTORY needs a number, a duration or a date, and [Phase] is Text”.

What is an update?

A data date. The last version saved with that data date stands for it. Each past update's values are worked out the way the baseline's are: from that version's own stored tasks, at its own data date.

Can I read the history of a formula column?

Yes: the column is worked out on each past update, from that update's own rows. But such a column can't itself read HISTORY or BASELINE() or make a what-if, and a column can't read its own history: "HISTORY can't read the column it is in".