使用单个查询获取每个多个日期间隔的条目数

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 DAYINTERVAL 1 WEEKINTERVAL 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) 相同,但要短得多。

以上是关于使用单个查询获取每个多个日期间隔的条目数的主要内容,如果未能解决你的问题,请参考以下文章

按核心数据中的日期组件获取条目

日期间隔 SQL

[Javascript]_[初级]_[获取日期的时间间隔-格式化日期时间]

[Javascript]_[初级]_[获取日期的时间间隔-格式化日期时间]

[Javascript]_[初级]_[获取日期的时间间隔-格式化日期时间]

使用动态日期间隔查询