使用单个查询获取每个多个日期间隔的条目数
Posted
技术标签:
【中文标题】使用单个查询获取每个多个日期间隔的条目数【英文标题】:Get number of entries per multiple date intervals using single query 【发布时间】:2016-12-06 02:22:36 【问题描述】:SELECT COUNT(*) FROM `table` WHERE `datetime` > SUBDATE(NOW(), INTERVAL 1 DAY)
这将获得最后一天的条目数。但是是否有可能获得多个间隔的条目数而不必多次发送此查询的变体(INTERVAL 1 DAY
、INTERVAL 1 WEEK
、INTERVAL 1 MONTH
、...)?
【问题讨论】:
你的预期输出是什么? 例如 3 行单列,每行包含日、周和月的条目数。 如果你得到 1 行有 3 列,如last day , last week, last month
?
是的,当然。听起来更好。
你说的上周是什么意思?是最后7天吗?你说的上个月是什么意思?是持续 30 天吗?
【参考方案1】:
您需要 CASE WHEN
表达式来完成此操作。
SELECT
COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay,
COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END ) AS lastSevenDays,
COUNT(*) AS lastThirtyDays
FROM `table`
WHERE
DATE(`datetime`) >= CURDATE() - INTERVAL 30 DAY
How to use CASE WHEN expression
注意:如果您的要求是获取最后一天、过去 7 天和过去 30 天的结果,请使用此查询。
编辑:
如果您在datetime
字段上有索引,则上述查询将无法使用该索引。请使用下面给出的查询以利用datetime
上的索引。
SELECT
COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay,
COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END ) AS lastSevenDays,
COUNT(*) AS lastThirtyDays
FROM `table`
WHERE
`datetime` >= (NOW() - INTERVAL 30 DAY - INTERVAL HOUR(NOW()) HOUR - INTERVAL MINUTE(NOW()) MINUTE - INTERVAL SECOND(NOW()) SECOND)
【讨论】:
聪明3合一SQL 我仍在阅读文档 (mariadb.com/kb/en/mariadb/case-statement),但我想最后一个COUNT
可以是 COUNT(*)
,因为我们上个月在 WHERE
中选择了。
你是对的。自 30 天以来,您可以使用 COUNT(*)
代替它。已更正。
好的,完全按照需要工作。我不知道COUNT
内部的CASE WHEN
。谢谢。
SUM(boolean)
与 COUNT(CASE WHEN boolean THEN 1 END)
相同,但要短得多。以上是关于使用单个查询获取每个多个日期间隔的条目数的主要内容,如果未能解决你的问题,请参考以下文章
[Javascript]_[初级]_[获取日期的时间间隔-格式化日期时间]
[Javascript]_[初级]_[获取日期的时间间隔-格式化日期时间]