Mysql 如何检查日期是否在范围内,而不考虑年份

Mysql 如何检查日期是否在范围内,而不考虑年份,mysql,Mysql,我想知道MySQL中最简单的检查给定日期是否在范围内的方法是什么,不管年份如何 在数据库表中,我有两个DATE字段:start和finish存储在YYYY-mm-dd 如果start=2013-11-01和finish=2014-03-01任何一年的11月1日至3月1日之间的任何事情都应被接受 有效日期: 2020-01-011980-02-28 无效日期: 2013-10-301968-07-30年度使用日: 当开始日期早于完成日期时: 测试日期应介于开始日期和结束日期之间(或在开始或结束时

我想知道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

年度使用日:

当开始日期早于完成日期时:

  • 测试日期应介于开始日期和结束日期之间(或在开始或结束时)
当完成日期早于开始日期时:

  • 测试日期应在开始日期和结束日期之外(或在开始或结束时)

几乎可以肯定有更干净的方法,但这应该是可行的:

((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))))
在最后一个括号之前。

从日期为t的表格中选择*,其中月(t.start)>=11,月(t.finish)<3
SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND month(t.finish) < 3 
如果你想要3月1日,它将是这样的:

SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND (month(t.finish) < 3 OR month(finish) <= 3 AND day(finish)<=1)

从日期为t的表格中选择*,其中月(t.start)>=11和月(t.finish)<3或月(finish)您可以使用一些日期提取功能,然后检查您的状况

比如说

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

现在你可以从以上两个结果中检查条件。

当你说介于之间时,你的意思是包括3月1日,还是3月1日前的午夜?包括开始和结束你的问题有点不清楚,你的输入变量是什么?是一个日期还是一个范围?请提供一些你已经尝试过的sql!如果
start=2013-10-01
end=2015-11-01
,您是否只想检索10-01和11-01之间的日期。或者因为范围跨越13个月,您想返回所有日期吗?只返回10-01和11-01之间的日期,正如我所说的“不考虑年份”,因此它是一个月的范围,而不是13我看不出这对给定的示例如何起作用,datediff也考虑了年份,并提供了新的解决方案,因为你会从那一年中减去1月1日,但我现在看到DAYOFYEAR更简单了,我的意思是你仍然需要做额外的检查来应对。Jan->March可以如果不使用与Dec->Mar
Date>Jan和Date
相同的比较,则所有记录的
Date>Dec和Date
都将失败。我明白了。你的意思是,当结束日期跨越年份边界时,测试应该反转。换句话说,当结束日期早于开始日期时。开始和结束日期是参数..如果他输入start as 11,finish as 2,则您的查询将返回每条记录,而不检查其日期。在上例中,如果@date=1968-07-30,这将不起作用。使用什么start和end参数?它如何失败?start=2013-11-01和finish=2014-03-01设置@date='1968-07-30';选择*FROM
test
WHERE((DAYOFYEAR(
finish_date
)>DAYOFYEAR(
start_date
)和(DAYOFYEAR(@date)>=DAYOFYEAR(
start_date
)和DAYOFYEAR(@date)我很困惑,表格(
test
)包含开始日期和结束日期范围?然后输入1个日期,并希望返回该日期所在的所有范围?是:)顺便说一句,感谢您的帮助,这看起来是一个常见的要求,但它太令人困惑了
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')
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