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