Date between dates, ignore year
Since you indicated that you're fine storing an arbitrary year in your data, then you can keep using a DATE
type. Then it just comes down to how to query.
Store the fields using a fixed arbitrary year. You should use a leap-year to accommodate the possibility of Feb 29th values. Year 2000 works nicely. (0004 won't work because it's too small for MySQL's
Date
type.)Replace the year of any value you're querying with the same year.
Consider ranges that cross over the end of one year and into the next. To fully answer that, you'll need a query such as the following:
SET @dt = cast(CONCAT('2000',RIGHT(thesourcedatevalue,6)) as DATE); SELECT some_column FROM dates WHERE (since <= upto AND since <= @dt AND upto >= @dt) OR (since > upto AND (since <= @dt OR upto >= @dt))
Here is a SQL Fiddle that demonstrates
For performance, you should be sure that there is an index that includes the
since
andupto
fields.
SELECT foo FROM dates WHERE DATE_FORMAT('2014-01-15', "%m-%d")
BETWEEN DATE_FORMAT(`since`,"%m-%d") AND DATE_FORMAT(`upto`,"%m-%d")
Here's the SQL FIDDLE demo
Use the DayOfYear function:
SELECT foo FROM dates WHERE DayOfYear('2014-05-05')
BETWEEN DayOfYear(`since`) AND DayOfYear(`upto`)