Mysql 选择日期在X个月内的位置,而不考虑存储年份

Mysql 选择日期在X个月内的位置,而不考虑存储年份,mysql,sql,date,comparison,Mysql,Sql,Date,Comparison,我目前有一个查询,它正在获取距离截止日期不到3个月的记录。截止日期存储为日期,但年份并不重要,因为此记录应每年标记一次 我的问题是: SELECT client_name FROM client WHERE MOD(DAYOFYEAR(deadline) - DAYOFYEAR(CURDATE()), +365) <= 90 AND DAYOFYEAR(deadline) > DAYOFYEAR(CURDATE()) 选择客户端名称 来自客户 其中MOD(DAYOFYEAR(

我目前有一个查询,它正在获取距离
截止日期不到3个月的记录。
截止日期
存储为日期,但年份并不重要,因为此记录应每年标记一次

我的问题是:

SELECT client_name 
FROM client 
WHERE MOD(DAYOFYEAR(deadline) - DAYOFYEAR(CURDATE()), +365) <= 90 
AND DAYOFYEAR(deadline) > DAYOFYEAR(CURDATE())
选择客户端名称
来自客户
其中MOD(DAYOFYEAR(deadline)-DAYOFYEAR(CURDATE()),+365)DAYOFYEAR(CURDATE())
如果我在记忆中写这篇文章时语法有错误,我表示歉意,但它确实有效

它一直工作到
截止日期
在第一季度,当前日期在最后一季度,然后它不再返回记录。我该怎么做

因此,查询需要返回截止日期在当前日期后3个月内的记录。应忽略
截止日期
日期中的年份,因为这可能是几年前的年份,但重要的是
截止日期
的日期和月份

或者问题是我存储的日期?我应该每年更新吗


谢谢

一种方法是使用如下条件测试:

WHERE CONCAT(YEAR(NOW()),DATE_FORMAT(d.deadline,'-%m-%d')) 
        + INTERVAL CONCAT(YEAR(NOW()),DATE_FORMAT(d.deadline,'-%m-%d'))<NOW() YEAR
    < NOW() + INTERVAL 3 MONTH
更改内联视图中分配给
@now
的值(别名为
i
),以使用其他日期值进行测试

(你可能想用
DATE(NOW())
来代替
NOW()
,这样时间就不会混在一起,你可能想从中减去另一天,这实际上取决于你想如何处理
截止日期的边缘情况,日期和月份与当前日期相同。(也就是说,你想像现在这样处理吗?)“过去”与否。)


总结方法:生成“下一个到期”截止日期作为未来的日期值,并与3个月后的a日期进行比较。

选择…where now()-间隔3个月<截止日期
?感谢您的回复。当截止日期为上一年时,这不起作用?它根本不关心年份。它只是查看截止日期字段是否少于3个月,例如截止日期=2015-03-15,现在=2015-05-20,现在-3个月=2015-02-20,因此
2015-02-20<2015-03-15
是真的。啊,是的ry第一次没有完全正常工作,因为条件不对。这非常有效。从
client
中选择
client\u name
,其中
截止日期
DAYOFYEAR(now())谢谢你的帮助Maxxi:我认为评论中显示的条件不符合规范。我认为你需要一个更像我回答中所示的条件。好吧,我的工程太复杂了,你可以在一周内完成这项工作,然后从那里开始计算(取决于你需要的精确程度)@杰斯特:你说得对,这可能是设计过度了。解决方案只需要尽可能精确。如果
WEEKOFYEAR
是一种更好的方法,那就试试吧。就我个人而言,我不喜欢大多数时候都“起作用”的解决方案".我更喜欢每次都能证明有效的解决方案,并且100%满足规范要求。如果无法满足规范要求,我们将协商更改要求,因此我们确实有一个可以满足的要求,100%正确、准确和精确。这太完美了!非常感谢您给我c正确的解决方案,但也解释它,并给我用于测试的声明,这是非常有用的!Maxxi:请随意使用
CURDATE()
代替
NOW()
。我应该使用
CURDATE
(或
DATE(NOW())
)在我的例子
WHERE
子句中,至少第二行和第三行的最后一次出现,
Maxxi:我给出的表达式确实需要测试,特别是边界情况……截止日期是今天,截止日期是昨天,截止日期是明天,再加上12月、12月31日、1月1日等的
@now
。,测试覆盖那些麻烦的边缘和角落案例。如果您发现角落案例有问题,请告诉我,我会仔细查看。(我确信这种方法非常可靠。)
SELECT 
       CONCAT(YEAR(@now),DATE_FORMAT(d.deadline,'-%m-%d')) 
       + INTERVAL CONCAT(YEAR(@now),DATE_FORMAT(d.deadline,'-%m-%d'))<@now YEAR 
       < @now + INTERVAL 3 MONTH   
    AS `due_in_3mo`

     , CONCAT(YEAR(@now),DATE_FORMAT(d.deadline,'-%m-%d')) 
       + INTERVAL CONCAT(YEAR(@now),DATE_FORMAT(d.deadline,'-%m-%d'))<@now YEAR 
    AS `next_due`

     , d.id
     , d.deadline + INTERVAL 0 DAY AS `deadline`
     , @now + INTERVAL 3 MONTH AS `now+3mo`
     , @now + INTERVAL 0 DAY AS `now`
  FROM d d
 CROSS
  JOIN (SELECT @now := '2015-11-01') i
 ORDER BY d.id