1

我想知道在 MySQL 中检查给定日期是否在范围内的最简单方法是什么,无论年份如何。

在数据库表中,我有两个DATE字段:startfinish存储在YYYY-mm-dd

如果start = 2013-11-01finish = 2014-03-01任何一年的 11 月 1 日和 3 月 1 日之间的任何事情都应该被接受。

有效日期: 2020-01-01 1980-02-28

无效日期: 2013-10-30 1968-07-30

4

4 回答 4

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 

在最后一个括号之前。

于 2013-11-08T10:03:53.413 回答
1

使用 DAYOFYEAR:

当一年中的开始日期早于完成日期时:

  • 测试日期应介于开始日期和结束日期之间(或开始或结束日期)

当完成日期在一年中早于开始日期时:

  • 测试日期应在开始日期和结束日期之外(或开始或结束日期)
于 2013-11-08T10:03:26.827 回答
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')
于 2013-11-08T10:20:08.963 回答
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

现在您可以从以上两个结果中检查条件..

于 2013-11-08T10:23:08.167 回答