| 
	
 | 
 Posted by --CELKO-- on 04/21/07 15:32 
The usual design error is to have only one time in a row to capture 
when an event started, then do horrible self-joins to get the duration 
of the status change.  Let me use a history table for price changes. 
The fact to store is that a price had a duration: 
 
CREATE TABLE PriceHistory 
(upc CHAR(13) NOT NULL 
  REFERENCES Inventory(upc), 
 start_date DATE NOT NULL, 
 end_date DATE, -- null means current 
 CHECK(start_date < end_date), 
 PRIMARY KEY (upc, start_date), 
 item_price DECIMAL (12,4) NOT NULL 
  CHECK (item_price > 0.0000), 
 etc.); 
 
You actually needs more checks to assure that the start date is at 
00:00 and the end dates is at 23:59:59.999 Hrs.  You then use a 
BETWEEN predicate to get the appropriate price. 
 
SELECT .. 
  FROM PriceHistory AS H, Orders AS O 
 WHERE O.sales_date BETWEEN H.start_date 
           AND COALESCE (end_date, CURRENT_TIMESTAMP); 
 
It is also a good idea to have a VIEW with the current data: 
 
CREATE VIEW CurrentPrices (..) 
AS 
SELECT .. 
  FROM PriceHistory 
 WHERE end_date IS NULL; 
 
Look up the Rick Snodgrass book on Temporal Queries in SQL at the 
University of Arizona website; it is a free download.
 
[Back to original message] 
 |