【问题标题】:MySQL get dates for drawing barchartMySQL获取绘制条形图的日期
【发布时间】:2014-10-05 12:12:09
【问题描述】:

我正在尝试使用以下查询从我的数据库中提取给定日期范围内的所有信息:

SELECT transactionDate, SUM(transactionTotal) 
  FROM transaction
 WHERE transactionDate BETWEEN '2014-06-01' AND '2014-08-11'
  AND transactionType = 'end'
GROUP BY DAYOFMONTH(transactionDate)
ORDER BY transactionDate ASC

但不知何故,我只得到了 1 个月的数据

2014-06-01 20:38:05 4811500.00
2014-06-02 20:42:59 5924950.00
2014-06-03 20:44:38 3811500.00
2014-06-04 11:45:13 4472000.00
2014-06-05 15:34:53 7922000.00
2014-06-06 17:45:28 5027000.00
2014-06-07 11:25:38 4378000.00
2014-06-08 07:59:04 4250000.00
2014-06-09 08:41:49 4766500.00
2014-06-10 01:23:35 4071000.00
2014-06-11 01:01:30 1459000.00
2014-06-12 15:05:08 2960000.00
2014-06-13 00:47:09 1160000.00
2014-06-14 16:52:20 4208000.00
2014-06-16 00:05:18 3947500.00
2014-06-17 00:18:39 4926000.00
2014-06-18 00:33:38 4244500.00
2014-06-19 00:43:39 4045000.00
2014-06-20 22:47:54 2649500.00
2014-06-21 23:06:04 4030000.00
2014-06-22 23:19:22 945500.00
2014-06-23 23:29:27 3015000.00
2014-06-24 23:35:56 2420000.00
2014-06-25 00:02:03 3920000.00
2014-06-26 00:50:33 4841000.00
2014-06-27 10:39:14 4095000.00
2014-06-28 07:43:06 5605500.00
2014-06-29 11:48:24 1939000.00
2014-06-30 10:49:50 3620000.00

如您所见,即使所有其他日期也有数据要显示,我也会得到 2014-06-01 到 2014-06-01 的结果。

希望你能帮助我,谢谢!

【问题讨论】:

  • 你按月分组,但想每天输出?那行不通

标签: mysql sql time-series aggregate-functions


【解决方案1】:

您在滥用GROUP BY,而有害的MySQL GROUP BY 扩展正在咬您。您正在使用 GROUP BY DAYOFMONTH() 将数据分组到 31 个存储桶中,因此您的结果集中不可能超过 31 行。然后(滥用扩展名)从 31 个分组中的每个分组中显示一些任意选择的 transaction_date 值。它恰好是 6 月的日期,这让您误以为您只选择了 6 月的记录。您实际上选择了范围内的所有日期,但错误地将 7 月和 8 月的记录与 6 月的记录组合在一起。哎哟。

其次,使用BETWEENDATETIME 列中选择日期范围不太正确,因为它使范围的末尾错误。 BETWEEN '2014-06-01' AND '2014-08-11' 获取从 6 月 1 日到 8 月 11 日第一刻的项目。所以 8 月 11 日中午发生的事情不会被选中。

这是您正确完成这项工作所需的查询。

    SELECT DATE(transactionDate),
           SUM(transactionTotal) 
      FROM transaction 
     WHERE transactionDate >= '2014-06-01'
       AND transactionDate  < '2014-08-11' + INTERVAL 1 DAY
       AND transactionType = 'end'
  GROUP BY DATE(transactionDate) 
  ORDER BY DATE(transactionDate) ASC

这里发生了什么?首先,我们使用DATE(),仅按每笔交易的日期进行分组,并将该分组值包含在我们的结果集中,使用SELECT DATE()

其次,日期范围选择会在 6 月 1 日午夜或之后的所有内容,直到 8 月 12 日午夜之前的那一刻。这就是transactionDate &lt; '2014-08-11' + INTERVAL 1 DAY 的意义所在。 8 月 11 日需要一整天的物品。

这里有一篇关于 SQL 技术角落的文章:http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

【讨论】:

  • 感谢@Ollie Jones,它现在按预期工作,我学到了一些对我的项目非常有用的东西。也感谢您的文章。
【解决方案2】:

使用下面的 sql 查询得到想要的结果

SELECT transactionDate, SUM(transactionTotal) FROM transaction WHERE transactionDate BETWEEN '2014-06-01' AND '2014-08-11' AND transactionType = 'end' GROUP BY CAST(transactionDate AS DATE) ORDER BY transactionDate ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2020-06-23
    • 2021-02-28
    相关资源
    最近更新 更多