MySQL:即使没有日期行,有没有办法获取两个日期之间所有日期的数据?

Posted

技术标签:

【中文标题】MySQL:即使没有日期行,有没有办法获取两个日期之间所有日期的数据?【英文标题】:MySQL: Is there a way to get data for all dates between two dates even when there are no date rows? 【发布时间】:2021-04-16 10:14:31 【问题描述】:

假设我有一个如下所示的 SELECT 查询:

SELECT orders.date
     , SUM(orders.amount) AS total_amount 
  FROM orders 
 WHERE orders.date >= '2021-04-01' 
   AND orders.date <= '2021-04-05';
 GROUP BY orders.date

在表格中,假设我没有日期 2021-04-03 和 2021-04-04 的任何记录,显然这两个日期不会返回任何总和数据。

我的问题,是否有可能有一个查询将空白日期返回为 0 total_amount 以便我可以得到这样的结果?

date total_amount
2021-04-01 11111
2021-04-02 22222
2021-04-03 0
2021-04-04 0
2021-04-05 12345

谢谢!

【问题讨论】:

生成基准日期列表(例如,在递归 CTE 中),然后将您的数据表加入其中。 或者只是处理应用代码中数据显示的问题 @Akina 谢谢,我不知道 CTE。有趣的概念。 【参考方案1】:

您可以生成一个“日历”表格,其中包含您希望出现在最终报告中的所有日期。然后,将其加入您当前的表格并计算总和。我们可以使用内联子查询来代替实际的日历表:

SELECT
    d.date,
    COALESCE(SUM(o.amount), 0) AS total_amount
FROM
(
    SELECT '2021-04-01' AS date UNION ALL        -- replace this ad-hoc table
    SELECT '2021-04-02' UNION ALL                -- with a bona-fide table
    SELECT '2021-04-03' UNION ALL                -- containing all dates
    SELECT '2021-04-04' UNION ALL
    SELECT '2021-04-05'
) d
LEFT JOIN orders o
    ON o.date = d.date
GROUP BY
    d.date
ORDER BY
    d.date;

【讨论】:

对我来说都是拉丁文 在这个 CTE 时代,我就是不能让自己去做。 Sic transit gloria mundi

以上是关于MySQL:即使没有日期行,有没有办法获取两个日期之间所有日期的数据?的主要内容,如果未能解决你的问题,请参考以下文章

获取MySQL中两个日期相差的天数

sql获取两个日期之间的每周开始日期

选择两个日期之间的 DataFrame 行

在两个表mysql上左连接时获取最后修改日期

MySQL中日期之间的月份差异

MySQL中日期之间的月差