我想知道在MySQL中检查给定日期是否在范围内的最简单方法是什么。
在数据库表格中,我有两个DATE
字段:start
和finish
存储在YYYY-mm-dd
如果start = 2013-11-01
和finish = 2014-03-01
任何一年的11月1日到3月1日之间的任何事情都应该被接受。
有效日期:
2020-01-01
1980-02-28
日期无效:
2013-10-30
1968-07-30
答案 0 :(得分:2)
几乎可以肯定有更简洁的方法,但这应该有效:
((DAYOFYEAR(finish_date) > DAYOFYEAR(start_date)
AND (DAYOFYEAR(@date) >= DAYOFYEAR(start_date)
AND DAYOFYEAR(@date) <= DAYOFYEAR(finish_date)))
OR (DAYOFYEAR(finish_date) <= DAYOFYEAR(start_date)
AND (DAYOFYEAR(@date) >= DAYOFYEAR(start_date)
OR DAYOFYEAR(@date) <= DAYOFYEAR(finish_date))))
对于2012年10月的开始日期和2020年11月的结束日期,这将返回10月至11月范围内的所有日期。如果实际上希望它在范围大于一年时返回所有日期(因此涵盖了一年中的所有日期),您可以添加:
OR DATEDIFF(Day, start_date, finish_date) > 356
在最后一个括号之前。
答案 1 :(得分:1)
使用DAYOFYEAR:
当年初的开始日期早于完成日期时:
当完成日期在年份中早于开始日期时:
答案 2 :(得分:0)
SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND month(t.finish) < 3
如果你想要第一个游行,它会像这样:
SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND (month(t.finish) < 3 OR month(finish) <= 3 AND day(finish)<=1)
根据您将在此处运行的数据大小。您可能会遇到性能问题,因为MySQL无法使用计算列的索引。 如果遇到这种情况,我建议将月份和/或日期分配到不同的列中。
编辑: 给出一个参数输入为'2008-02-29'
SELECT * FROM tableWithDates t
WHERE
month(t.start) >= month('2008-02-29') AND day(t.start) >= day('2008-02-29')
AND month(t.finish) <= month('2008-02-29') AND day(t.finish) <= day('2008-02-29')
答案 3 :(得分:0)
您可以使用某些日期提取功能,然后检查您的情况..
例如。
SELECT EXTRACT(MONTH FROM TIMESTAMP '2013-11-01 20:38:40');
this will give ouput start month as 11
SELECT EXTRACT(MONTH FROM TIMESTAMP '2014-03-01 20:38:40');
this will give ouput end month as 3
现在你可以从上面两个结果检查条件..