Team LiB   Previous Section   Next Section

5.4 Storing Out-of-Range Temporal Values

5.4.1 Problem

You are creating a database for an archeologist, and the archeologist needs to store dates that are outside the range of Transact-SQL's temporal datatypes.

5.4.2 Solution

Use the ISO 8601 format, preferably without the dashes between date elements, and store the data as string:

CREATE TABLE Archive(
   EventId CHAR(40),
   EventDate CHAR(8)
)

Now, insert a few dates and note the results:

INSERT INTO Archive 
  VALUES ('Columbus departs from Palos, Spain', '14920802')
INSERT INTO Archive 
  VALUES ('Columbus arrives at Cuba', '14921029')
INSERT INTO Archive 
  VALUES ('Columbus returns to Spain', '14930315')


SELECT * FROM Archive

EventId                             EventDate  
----------------------------------- ---------- 
Columbus departs from Palos, Spain  14920802  
Columbus arrives at Cuba            14921029  
Columbus returns to Spain           14930315 

5.4.3 Discussion

This is, of course, the old programmer's trick for representing temporal data in languages that don't have native support for it. It's designed for AD dates and such dates can easily be sorted properly. There are, however, two additional issues that need emphasizing.

First, don't use the 'YYYY-MM-DD' format when using the technique illustrated in this recipe. If you do use that format, don't forget to include leading zeros for all date elements. Dates such as '1492-8-2' cannot be sorted properly with respect to '1492-10-12'. If you must include dashes in your dates, you should include leading zeros, as in: '1492-08-02'.

The second issue, more of a feature than a problem, is that you can easily extend this format to include hours, minutes, and even seconds. Simply include the requisite number of digits in the date string. This isn't to say, though, that we understand the need for such precise temporal values for dates prior to the 18th century.

    Team LiB   Previous Section   Next Section