MySQL获取绘制条形图的日期

时间:2014-08-12 12:16:54

标签: mysql sql time-series aggregate-functions

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

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的结果。

希望你能帮助我,谢谢!

2 个答案:

答案 0 :(得分: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 < '2014-08-11' + INTERVAL 1 DAY的要点。 8月11日需要一整天的物品。

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

答案 1 :(得分:1)

使用以下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