- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 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));
这将产生以下数据集:
并在 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):
这符合您的期望吗? (如果日期优先级的顺序不“匹配”,只需根据需要更改它们或添加最小/最大,如果 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/
我正在尝试在 (date-7days) 和 (date-1day) 之间的日期范围内使用 DATE_SUB() 进行搜索查询(使用 pdo php 和 mysql),例如: end_date is 2
我正在尝试获取上个月 12 个月的所有帖子,按月分组。我有一个非常正确的查询: SELECT MONTH(time) as mois, YEAR(time) as annee, count(*) as
如何在 DATE_SUB 计算中使用动态创建的字段? 我有下面这个 SQL: SELECT *, CASE WHEN `currentDate` IS NULL
我有这个 order_createdAt >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY),它返回从现在到 7 天前的数据。如何获取8天前到14天前的数据? 最佳答案
我正在编写一个脚本,从数据库中选择生日提前 7 天的所有人,并向他们发送电子邮件 我可以选择所有今天生日的人,但我需要减去 7 天,这样我才能提前发送电子邮件。我已尝试多次使用 Date_Sub,但均
我有以下查询,以获取事件。 SELECT * FROM events_table WHERE event_date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDE
我有这部分查询: (@tmpo1245 := CAST( ( ( pm5.`meta_value` - pm4.`meta_value` ) / 86400 ) AS SIGNED ) ) AND (
我的 SQL 查询的一部分 DATE_SUB(dStartDate,INTERVAL 30 DAY) AS dEarlyBirdExipiryDate 它返回 dEarlyBirdExipiryDat
我需要有关 mysql 和 date_sub() 的帮助。我有一个表调用事件 Activity(id,deadline,alert) Activity(1,'2011-04-18','1 DAY');
在我看到这里有很多问题使用 DATE_SUB() 或 DATE_ADD() 函数而不是算术运算符 + 或-,我想知道有没有区别: 引自MySQL-manual : Date arithmetic al
我收到错误 'NOW' is not a recognized built-in function name. SQL 存储过程: SELECT * FROM BlogPost WHERE BlogD
我想知道是否可以将参数传递给 mysql 存储过程并将此参数用作 DATE_SUB 函数的 unit 参数。 unit参数好像是保留字,不知道有没有unit类型。 我正在尝试做的事的例子: DELIM
我在贾斯珀有一个查询: SELECT date_format( DATE_SUB(a.start_stamp, INTERVAL 5 hour),
我想在一个查询中显示商品代码的每月销售额。但我现在唯一能做的就是得到它的全部。我正在使用 date_sub。 select p.itemcode, sa.quantity from sales sa
我在脚本中使用以下查询,该脚本会根据订单日期 - 1 个月自动向客户充值。 SELECT * FROM registrations WHERE orderdate = DATE_SUB(CURDATE
有一个表,其中有一列用于存储日期时间(格式:2014-5-5 9:21pm)。我正在使用 PDO 在 60 天内从该表中获取数据,并比较日期时间列值。我的查询没有回应。有人可以告诉我出了什么问题吗?
我有以下查询; SELECT count(*) as aggregate FROM cars INNER JOIN snapshots ON cars.snapshot_id=snapshots.id
我有这个 mysql 查询 SELECT * FROM all_sent_Orders a WHERE a.nachforschungCompletedOn IS NULL AND CAS
我已经查看这个语句很长时间了,就是找不到错误,你们能帮忙吗? SELECT XD.*, UhED.row_class, (SELECT id
我正在努力使用 Illuminate 数据库查询生成器进行查询。当我使用查询时,结果并不符合我的预期。当直接使用 mysql cli 使用查询日志中的查询时,我得到了预期的结果。 使用查询生成器:
我是一名优秀的程序员,十分优秀!