How do I store (and sort) vague date ranges?

database, database-design, types

Solution

You can insert the earliest and the latest date possible for the range.

Like, exact date will be

Jan 1, 1960   Jan 1, 1960

, c. 1960 will be

Jan 1, 1960   Dec 31, 1960

, 1960s will be

Jan 1, 1960   Dec 31, 1969

etc.

Then you can order by the first date and the datediff:

SELECT  *
FROM    mytable
ORDER BY
        start_date, DATEDIFF(end_date, start_date) DESC

Alternatively, you can store the expected value and the deviation instead of the start and end dates.

Problem

I have a database which needs to store year ranges (such as lifespan) which in some instances aren't very specific. For example, as well as the usual '1960', we have 'c. 1960' for "around 1960", and 1960s for in the decade 1960, as well as 'nd' for no date which is distinctly different from NULL which would be until present. What would be the best way to store these? I was thinking of possibly storing the year as a string and appending 's' for decades and 'c' for circa, with 'nd' for no date... but this feels just wrong. Also, when sorting chronologically I need to sort by inserting 1960s items before c. 1960 items, which in turn are before 1960 items. How do I do this properly? Some example date ranges: 1957 c. 1957 c. 1957 - 1965 c. 1957 - 1960s c. 1957 - present c. 1957 - nd Thanks for your help!

Original source