--CELKO--
3/25/2007 10:39:00 PM
This is the general skeleton of a history table
CREATE TABLE ZipCodeHistory
(low_zip CHAR (5) NOT NULL
CHECK(low_zip LIKE '[0-9][0-9][0-9][0-9][0-9]'),
high_zip CHAR (5) NOT NULL
CHECK(low_zip LIKE '[0-9][0-9][0-9][0-9][0-9]'),
CHECK (low_zip <= high_zip),
town_name CHAR(25) NOT NULL,
start_date DATETIME NOT NULL.
end_date DATETIME, -- null is current
CHECK (start_date < end_date));
Since SQL Server does not have full SQL-92 constraints, the rule about
no overlapping dates is a bit hard. One answer is to build a Calendar
table and put this in a TRIGGER:
IF EXISTS (SELECT *
FROM Calendar AS C, ZipCodeHistory AS Z
WHERE C.cal_date BETWEEN Z.start_date AND Z.end_date
GROUP BY C.cal_date
HAVING COUNT(*) > 1)
ROLLBACK;
Or you can use a VIEW
CREATE VIEW ZipStuff (..)
AS
SELECT ..
FROM ZipCodeHistory AS Z
WHERE NOT EXISTS (SELECT *
FROM Calendar AS C, ZipCodeHistory AS Z
WHERE C.cal_date BETWEEN Z.start_date AND Z.end_date
GROUP BY C.cal_date
HAVING COUNT(*) > 1)
WITH CHECK OPTION;
The WITH CHECK OPTION is not well known.