http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&threadm=8443-35FB3909-58%40newsd-141.iap.bryant.webtv.net&rnum=7&prev=/groups%3Fhl%3Den%26lr%3D%26ie%3DISO-8859-1%26q%3Dbitemporal%26btnG%3DGoogle%2BSearch%26meta%3D A colleague and I implemented and successfully deployed a fully bitemporal HR system at Union Bank of Switzerland several years ago. Our take on the problem (strongly suggested by our clients' intended use) was that we should be able to track changes in the properties of individuals over time, based on time-stamped assertions involving predicates-over-an-interval. The assertions had the form: On o-time: value = property(individual) at all times greater than f-time and less than or equal to t-time. Assertions were appended to property tables. For example, the assertion On 1995-12-01 13:45:22 GMT '555-1234' = phone(101) from 1995-5-17 00:00:00 GMT to Infinity was appended to the Phone table. Each property table had five attributes: individual (i) value (v) on-time (o) from-time (f) to-time (t) Assertions could be wholly about the past, wholly about the future, or about intervals overlapping the present. We did not support deletes. We identified five important forms of bitemporal query: 1. Individual: on time o, which individuals satisfy c at time a? Example: on 1997-1-1, who did the db say would have 555- phone numbers, offices on the 12th floor, and salaries greater than $20K on 1997-2-1? 2. Property: on time o, for property p and individuals i, which values satisfy ... x = p i ... at time a? Example: on 1997-1-1, which offices did the db say individuals 12, 14, 18 had at 1996-6-1? 3. Individual History: for constant o, p, i, satisfy v, f, and t in the assertion scheme: on o, v=p i from f to t. Example: on 1997-1-1, what phone numbers has individual 123 had? have now? will have? and when? 4. Multi-property Individual History: for constant o, ...pj..., i, satisfy v, f, and t in the assertion scheme: on o, v=pj i from f to t. Example: on 1997-1-1, what is the name- and phone-history of individual 123? 5. Property History: for constant o, p, v, satisfy i, f, and t in the assertion scheme: on o, v=p i from f to t. Example: on 1997-1-1, who had a 555- phone number, and when? Who has one now? And who will have one, and when? The fundamental algorithm involves generating a state w.r.t. a property and an individual at a time. Later assertions can wholly or partly mask earlier assertions. A special case involved generating a non-temporal snapshot from a time and a set of properties -- equivalent to the problem of reconstructing the database as it was at a given time. In this case, we were able to make good use of what others have called "the ferociously serial processing" of the K database language. Here is one interesting consequence of full bitemporality: you cannot (or, at least, should not) insist that any property is immune to revision. For example, it might seem as though some properties can be relied on not to change; e.g., social security number, or employee id. But one of the uses of a bitemporal database is to keep track of errors and subsequent corrections. So one must allow that any property of an individual can be incorrectly recorded.