我正在尝试将两个带有日期条件的计数查询(如下所示)转换为一个查询。
SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY)
SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY)
Following the advice of another answer我创建了以下代码,但在语法方面似乎不起作用,我也不太确定原因。有没有其他方法可以做到这一点?我在这个问题上找不到类似的问题
SELECT
SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY))) AS testcount1,
SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY))) AS testcount2
FROM
orders
发布于 2020-03-30 07:55:40
你想要条件聚合。我将该查询表述为:
SELECT
SUM(
timedate >= CURRENT_DATE - INTERVAL 1 DAY
and timedate < CURRENT_DATE
) AS testcount1,
SUM(
timedate >= CURRENT_DATE - INTERVAL 2 DAY
and timedate < CURRENT_DATE- INTERVAL 1 DAT
) AS testcount2
FROM orders
详细信息:
0/1
,timedate
列:相反,我们进行litteral日期比较。这要高效得多,因为数据库可能会利用datetime列上的索引
您可能还希望将WHERE
子句添加到查询中:
WHERE
timedate >= CURRENT_DATE - INTERVAL 2 day
AND timedate< CURRENT_DATE
发布于 2020-03-30 07:57:37
您缺少IF
表达式的输出值。此外,您还应该使用CURRENT_DATE()
,这样就不需要转换为DATE
SELECT
SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY, 1, 0)) AS testcount1,
SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY, 1, 0)) AS testcount2
FROM
orders
请注意,MySQL在数值上下文中将布尔表达式视为1
(true
)或0
(false
),因此您实际上可以对表达式执行SUM
操作,而不需要IF
SELECT
SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY) AS testcount1,
SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY) AS testcount2
FROM
orders
https://stackoverflow.com/questions/60926157
复制