gpt4 book ai didi

mysql 使用 date_sub 按日期匹配

转载 作者:行者123 更新时间:2023-11-29 11:01:07 25 4
gpt4 key购买 nike

我有这个 mysql 查询

SELECT *
FROM
all_sent_Orders a
WHERE
a.nachforschungCompletedOn IS NULL AND
CASE WHEN a.lastMessageSent IS NOT NULL AND a.lastResponse IS NULL
THEN
date(date_sub(current_date, INTERVAL 7 DAY)) = date(a.lastMessageSent)
ELSE
(date(date_sub(current_date, INTERVAL 30 DAY)) = date(IFNULL(a.lastResponse, a.nachforschungSentOn))
OR date(date_sub(current_date, INTERVAL 60 DAY)) = date(IFNULL(a.lastResponse, a.nachforschungSentOn))
OR date(date_sub(current_date, INTERVAL 90 DAY)) = date(IFNULL(a.lastResponse, a.nachforschungSentOn))
OR date(date_sub(current_date, INTERVAL 120 DAY)) = date(IFNULL(a.lastResponse, a.nachforschungSentOn)))
END

令我困扰的是从ELSE开始的部分。我需要找到今天 - 30,60,90,120,150,... 天的所有条目。有没有办法将多个 OR 重写为单个表达式,匹配相同的内容?

我正在考虑一个循环,但这只能在过程中起作用。我想避免这种情况,但如果没有其他选择,我也可以接受。

最佳答案

经过您的评论和更新,我相信您需要的是 HAVING 而不是 WHERE。 (*不是真的,请参阅帖子末尾,在这种情况下都有效。)

因此,应该按照需要简化您的查询:

考虑数据集:

INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(1, date_sub(NOW(), INTERVAL 30 DAY), NULL, NULL);
INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(2, date_sub(NOW(), INTERVAL 20 DAY), date_sub(NOW(), INTERVAL 60 DAY), NULL);
INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(3, null, null, date_sub(NOW(), INTERVAL 90 DAY));

INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(4, date_sub(NOW(), INTERVAL 29 DAY), NULL, NULL);
INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(5, date_sub(NOW(), INTERVAL 20 DAY), date_sub(NOW(), INTERVAL 59 DAY), NULL);
INSERT INTO test2 (id, lastMessageSent, lastResponse, nachforschungSentOn)VALUES(6, null,null , date_sub(NOW(), INTERVAL 89 DAY));

这将产生以下数据集:

enter image description here

并在 2017-02-14 上使用以下查询:

SELECT 
a.* ,
COALESCE( a.lastResponse, COALESCE( a.lastMessageSent, a.nachforschungSentOn ) ) AS relevantDate,
DATEDIFF( NOW( ) , COALESCE( a.lastResponse, COALESCE( a.lastMessageSent, a.nachforschungSentOn ) ) ) AS age
FROM
test2 a
HAVING
age
IN ( 30, 60, 90, 120, 150, 180 )

将产生以下结果,因为 id 4,5,6 与 30 天的倍数不匹配(请参阅第二个屏幕截图,不带having-clause):

enter image description here

enter image description here

这符合您的期望吗? (如果日期优先级的顺序不“匹配”,只需根据需要更改它们或添加最小/最大,如果 null-thingy 是错误的:))

编辑:

使用where它应该也可以工作,因为没有group by。两者的性能应该几乎相同,因为查询中没有join。 (如果存在连接,最好使用 WHERE 而不是 HAVING (如果可能的话:where 不适用于聚合数据)最小化连接结果)

SELECT 
a.* ,
COALESCE( a.lastResponse, COALESCE( a.lastMessageSent, a.nachforschungSentOn ) ) AS relevantDate,
DATEDIFF( NOW( ) , COALESCE( a.lastResponse, COALESCE( a.lastMessageSent, a.nachforschungSentOn ) ) ) AS age
FROM
test2 a
WHERE
DATEDIFF( NOW( ) , COALESCE( a.lastResponse, COALESCE( a.lastMessageSent, a.nachforschungSentOn ) ) )
IN ( 30, 60, 90, 120, 150, 180 )

pps.:正如您所看到的 - 解决方案中没有 date_sub - 所以您的问题正是第一条评论中概述的 XY 问题的情况 - 只是因为您认为 date_sub 可以解决这个问题。 :P

关于mysql 使用 date_sub 按日期匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com