Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按间隔分组重叠时间戳MySQL查询_Mysql_Group By_Timestamp_Intervals - Fatal编程技术网

按间隔分组重叠时间戳MySQL查询

按间隔分组重叠时间戳MySQL查询,mysql,group-by,timestamp,intervals,Mysql,Group By,Timestamp,Intervals,我一直在读其他问题,但运气不好。我有一个带有列(戳记、值)的表。“stamp”列存储每小时的时间戳。我试图做的是根据查询中指定的时间戳范围检索24小时间隔的总和(值): SELECT stamp, Sum(value) FROM table WHERE stamp >= Date_sub('2012-12-02 05:00:00', INTERVAL 1 day) AND stamp < '2013-01-01 05:00:00' GROU

我一直在读其他问题,但运气不好。我有一个带有列(戳记、值)的表。“stamp”列存储每小时的时间戳。我试图做的是根据查询中指定的时间戳范围检索24小时间隔的总和(值):

SELECT stamp, 
       Sum(value) 
FROM   table 
WHERE  stamp >= Date_sub('2012-12-02 05:00:00', INTERVAL 1 day) 
       AND stamp < '2013-01-01 05:00:00' 
GROUP  BY Date(stamp) 
实际表如下所示:

stamp                      value
2012-12-02 05:00:00        12024
2012-12-03 05:00:00        11211
2012-12-04 05:00:00        19834
...
2013-01-01 05:00:00        10232
stamp                      value
2012-12-01 01:00:00        345
2012-12-01 02:00:00        100
2012-12-01 03:00:00        104
2012-12-01 04:00:00        103
2012-12-01 05:00:00        101
2012-12-01 06:00:00        102
...
2013-01-01 05:00:00        207
2013-01-01 06:00:00        307
2013-01-01 07:00:00        223
...

*请注意,stamp列的数据类型是timestamp

我想您只需要将小时数设置为5,以与您的范围保持一致。如果是,您可以这样做:

SELECT cast(date(stamp) as datetime) + interval 5 hour
       Sum(value) 
FROM   table 
WHERE  stamp >= Date_sub('2012-12-02 05:00:00', INTERVAL 1 day) 
       AND stamp < '2013-01-01 05:00:00' 
GROUP  BY Date(stamp) 
选择cast(日期(戳记)作为日期时间)+间隔5小时
总和(价值)
从桌子上
其中盖章>=日期(2012-12-02 05:00:00),间隔1天
邮票<'2013-01-01 05:00:00'
分组日期(盖章)
但是,我想你可能真的想用不同的措辞来表达:

SELECT cast(date(stamp - interval 5 hour) as datetime) + interval 5 hour
       Sum(value) 
FROM   table 
WHERE  stamp >= Date_sub('2012-12-02 05:00:00', INTERVAL 1 day) 
       AND stamp < '2013-01-01 05:00:00' 
GROUP  BY Date(stamp - interval 5 hour)
选择cast(日期(戳记-间隔5小时)作为日期时间)+间隔5小时
总和(价值)
从桌子上
其中盖章>=日期(2012-12-02 05:00:00),间隔1天
邮票<'2013-01-01 05:00:00'
按日期分组(盖章-间隔5小时)
这实际上会重新调整5小时边界上的日期

注意:这些查询未经测试,因此可能包含语法错误


这是假设时间戳实际上是一个日期时间。如果它是UNIX时间戳,您需要首先转换它。

在每个日期组的最早时间戳上方返回的
戳也是如此吗?请不要选择不在
组中的列。MySQL扩展了此功能,但其行为并不精确,应避免使用。只要可能,请使用y和z之间的
x
,而不是
x>=y和x。上面返回的戳记是每个日期组的最新戳记。例如,将2012-12-01 05:00:00到2012-12-02 05:00:00之间的所有值相加。对不起,我编辑了这篇文章,因为我在“日期(戳记)”方面有一个键入错误。感谢您的回复。我确实如期得到了邮票,但总数(价值)似乎不太准确。我检查并意识到stamp列是UNIX时间戳,而不是datetime。