【问题标题】:How to SELECT the last 30 days records from SQL, including days with zero?如何从 SQL 中选择最近 30 天的记录,包括零天?
【发布时间】:2022-01-01 22:35:18
【问题描述】:

我想从我的表中选择最近 30 天的记录。我的查询如下所示:

SELECT DATE(o_date) as date, count(id) AS sum FROM customers WHERE o_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND NOW() GROUP BY o_date

或者这个:

SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE o_date >= DATE(NOW()) + INTERVAL -30 DAY GROUP BY DATE(o_date)

我想创建一个包含日期和 id-s 计数的列表。

但是在我没有确切日期的任何记录的情况下,查询只是跳过该日期。但我想在那里插入一个零。

例子:

id o_date
1 2021-11-23
2 2021-11-22
3 2021-11-20
4 2021-11-20
5 2021-11-19
6 2021-11-18
7 2021-11-18

结果会是这样的:

date sum
2021-11-23 1
2021-11-22 1
2021-11-20 2
2021-11-19 1
2021-11-18 2

但是在 2021 年 11 月 21 日我没有像这个例子中这样的记录的地方,我怎样才能插入总和 0?

谢谢!

更新: 我需要这个 MariaDB 查询。

【问题讨论】:

标签: mysql sql mariadb


【解决方案1】:

对于 MariaDB,

SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE o_date BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();

对于 SQL,

SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE DATEDIFF(day,o_date,GETDATE()) < 31

SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE DATEDIFF(day,o_date,GETDATE()) between 0 and 30

【讨论】:

  • 我刚刚更新了这个问题。我需要 MariaDB 的这个查询,所以 DATEDIFF 只需要 2 个两个参数。我试过这个查询:SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE DATEDIFF(o_date,CURDATE()) between 0 and 30 但是在这种情况下,结果只有一行与今天的日期。
【解决方案2】:

据我所知,应该是:

SELECT * FROM customers WHERE o_date BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();

链接到将近 10 年前的帖子: MySQL Query - Records between Today and Last 30 Days

【讨论】:

    【解决方案3】:

    试试这个查询:

    SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE o_date >= DATE_ADD(NOW(), INTERVAL -30 DAY)

    【讨论】:

    • FUNCTION xxxx.DATEADD 不存在:/
    • 对不起,它是用于 sql server。在 mysql 中,它是 DATE_ADD(NOW(), INTERVAL -30 DAY)。然后查询将变为 SELECT DATE(o_date) AS date, COUNT(id) AS sum FROM customers WHERE o_date >= DATE_ADD(NOW(), INTERVAL -30 DAY)。我已经编辑了评论
    【解决方案4】:

    您真正的问题似乎是关于如何显示所有 30 天,甚至是零值的天。

    由于您使用的是 MariaDB 10.0 或更高版本,因此有一个绝妙的技巧可以给出一个范围内的所有天数:

    MariaDB [test]> SELECT '2019-01-01' + INTERVAL seq-1 DAY  AS dates   FROM seq_1_to_31;
    +-----------------------------------+
    | dates                             |
    +-----------------------------------+
    | 2019-01-01                        |
    | 2019-01-02                        |
    | 2019-01-03                        |
    | 2019-01-04                        |
    | 2019-01-05                        |
    | 2019-01-06                        |  etc.
    

    所以,你要做的是

    SELECT ...
        FROM ( select using seq table ) AS dates
        JOIN ( your table ) AS yours ON dates.dy = yours.o_date
        WHERE ...
    

    关于如何请求日期范围的第二个问题 - 您的两次尝试都给出了相同的结果和相同的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多