Mysql:如何根据半小时时间戳将数据聚合成天?

时间:2012-01-10 11:04:09

标签: mysql aggregate-functions

这个问题听起来比它可能更复杂。我有一个非常简单的表与PHP时间戳(只是整数,而不是MySQL日期字段)和浮点值。

id | timestamp | values |

值以半小时为间隔存储,因此每个时间戳增加半小时。

我想在一个查询中将数周的数据汇总到几天,所以响应看起来像这样(1317596400 = OCT 3RD 2011)

0 | 1317596400 | 10.5
1 | 1317682800 | 9.65
2 | 1317769200 | 8.1
3 | 1317855600 | 9.6
4 | 1317942000 | 10.11
5 | 1318028400 | 12.1
6 | 1318114800 | 11.8

如果时间戳为00:00或12:00,则标识当天的任何内容。

有什么想法吗?

更新:

我取得了一些进展......

SELECT FROM_UNIXTIME(timestamp) as stamp, sum(data) FROM energy 
WHERE
timestamp >= 1317423600
AND
timestamp <= 1320105600
GROUP BY (  DATE( stamp ) ) 

但这似乎限制了对一个月的反应。我似乎无法从1个月中旬到另一个月中旬进行查询。

按“日期”分组而不是“日”,否则您最终会将(例如)5月1日和4月1日的值合并为一行。

4 个答案:

答案 0 :(得分:3)

如果你的日子是UTC天,你可以GROUP BY (timestamp - timestamp % 86400)

短公式将时间戳舍入到最近的整天,尽管整天都是从00:00 UTC开始。

这可以避免从UNIX纪元转换为DATETIME值。

答案 1 :(得分:2)

我认为最困难的部分是将整数解析为字符串中的日期。

你可以这样做DATE(FROM_UNIXTIME(1317596400))

答案 2 :(得分:1)

您可以将时间戳转换为日期,将日期截断为午夜,然后将其转换回时间戳值。有点像这样:

select unix_timestamp(date(from_unixtime(timestamp))) as "phpDate",
sum(someValues) as "values"
from myTable
group by phpDate;

希望我在这里得到了正确的结局!

答案 3 :(得分:0)

将时间戳转换为MySQL可以使用的内容,然后按日期对结果进行分组。

SELECT FROM_UNIXTIME(timestamp) as stamp, sum(data) FROM energy 
WHERE
timestamp >= 1317423600
AND
timestamp <= 1320105600
GROUP BY (  DATE( stamp ) )