我想知道在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
发布于 2013-11-08 10:03:53
几乎可以肯定的是,有更清洁的方法可以做到这一点,但这应该是可行的:
((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 在最后一个支架之前。
发布于 2013-11-08 10:03:26
使用DAYOFYEAR:
当一年中的开始日期早于完成日期时:
如果完成日期早于开始日期,则为:
发布于 2013-11-08 10:20:08
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')https://stackoverflow.com/questions/19856180
复制相似问题