首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查日期是否在范围内而不论年份

如何检查日期是否在范围内而不论年份
EN

Stack Overflow用户
提问于 2013-11-08 09:58:39
回答 4查看 419关注 0票数 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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-08 10:03:53

几乎可以肯定的是,有更清洁的方法可以做到这一点,但这应该是可行的:

代码语言:javascript
运行
复制
((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月范围内的所有日期。实际上,如果希望它返回范围大于一年的所有日期(因此涵盖一年的所有日期),则可以添加:

代码语言:javascript
运行
复制
OR DATEDIFF(Day, start_date, finish_date) > 356 

在最后一个支架之前。

票数 2
EN

Stack Overflow用户

发布于 2013-11-08 10:03:26

使用DAYOFYEAR:

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

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

如果完成日期早于开始日期,则为:

  • 测试日期应在开始日期和结束日期(或开始日期或结束日期)之外。
票数 1
EN

Stack Overflow用户

发布于 2013-11-08 10:20:08

代码语言:javascript
运行
复制
SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND month(t.finish) < 3 

如果你想要三月一日,它会是这样的:

代码语言:javascript
运行
复制
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”

代码语言:javascript
运行
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19856180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档