mysql - mySql 中的小时明智数据

标签 mysql datetime group-by time-series aggregate-functions

我有包含以下字段的表格

Createdon(datetime)
Amount(double)

我需要查找给定日期接下来 24 小时内的金额总和。如果没有结果,则总和应为零。 例如

duration  sum
0000-0001 25.43
0001-0002 36.85
0002-0003 0
.
.
.
.
0022-0023 38.56

您能帮我创建一个查询来查找所需的解决方案吗

最佳答案

查询的关键是能够获取任何日期时间值并将其截断为最近的一小时。您可以使用以下表达式来做到这一点:

 DATE_FORMAT(Createdon, '%Y-%m-%d %H:00')

例如,给定 2015-04-21 14:22:05,这将返回 2015-04-21 14:00:00

然后你在 GROUP BY 中使用它

SELECT DATE_FORMAT(Createdon, '%Y-%m-%d %H:00') Createdhour,
       SUM(Amount) sum
  FROM theTable
 GROUP BY DATE_FORMAT(Createdon, '%Y-%m-%d %H:00')
 ORDER BY DATE_FORMAT(Createdon, '%Y-%m-%d %H:00')

最后,我认为您想要一天的结果。您需要添加一个 WHERE 子句才能获得该结果。此处显示的结果将采用昨天的结果 - 即 [昨天午夜 - 今天午夜] 的所有结果。

SELECT DATE_FORMAT(Createdon, '%Y-%m-%d %H:00') Createdhour,
       SUM(Amount) sum
  FROM theTable
 WHERE CreatedOn >= DATE(NOW()) - INTERVAL 1 DAY
   AND CreatedOn <  DATE(NOW())
 GROUP BY DATE_FORMAT(Createdon, '%Y-%m-%d %H:00')
 ORDER BY DATE_FORMAT(Createdon, '%Y-%m-%d %H:00')

这在http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/中有更详细的解释。

要包含一天中的所有时间,您将需要不同 DATETIME 项目的独立来源。

这是一个可以执行此类操作的查询。

      SELECT mintime + INTERVAL seq.seq HOUR AS CreatedHour
        FROM (
              SELECT DATE(NOW()) - INTERVAL 1 DAY AS mintime,
                     DATE(NOW()) AS maxtime
             ) AS minmax
        JOIN seq_0_to_23 AS seq 
              ON seq.seq < TIMESTAMPDIFF(HOUR,mintime,maxtime)

然后您需要使用LEFT JOIN 来获取数据。

SELECT a.Createdhour,
       SUM(Amount) sum
  FROM (
      SELECT mintime + INTERVAL seq.seq HOUR AS CreatedHour
        FROM (
              SELECT DATE(NOW()) - INTERVAL 1 DAY AS mintime,
                     DATE(NOW()) AS maxtime
             ) AS minmax
        JOIN seq_0_to_23 AS seq 
              ON seq.seq < TIMESTAMPDIFF(HOUR,mintime,maxtime)
       ) a
  LEFT JOIN theTable t 
          ON a.CreatedHour  = DATE_FORMAT(t.Createdon, '%Y-%m-%d %H:00')
 GROUP BY DATE_FORMAT(t.Createdon, '%Y-%m-%d %H:00')
 ORDER BY DATE_FORMAT(t.Createdon, '%Y-%m-%d %H:00')

最后,您需要以某种方式获取该表seq_0_to_23。如果您正在运行 MariaDB,它是内置的。如果没有……

CREATE TABLE seq_0_to_23 AS
 SELECT 0 AS seq 
  UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3
  UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6
  UNION ALL SELECT  7 UNION ALL SELECT  8 UNION ALL SELECT  9
  UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
  UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
  UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
  UNION ALL SELECT 22 UNION ALL SELECT 23

这以更通用的形式写在 http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/

关于mysql - mySql 中的小时明智数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29771812/

相关文章:

php - 将迭代算法应用于数据库中的一组行

MySQL 让我很沮丧 -

php - 如何使用php从数据库中提取日期

python - 将 Python 时间转换为 MicroPython PyBoard

sql - 如何在 SQL MERGE 语句中使用 GROUP BY 子句?

python - GroupBy 操作使用整个数据框对值进行分组

java - 使用Java在MySql数据库中插入汉字

php - 仅当两列(持续时间和分数)不同时,如何增加 mysql 中的排名?

c# - 如何在 C# 中使用 DateTime.Now.Ticks 保持精度

sql - 对一列进行分组并获取该列的总和