这个问题听起来比它可能更复杂。我有一个非常简单的表与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日的值合并为一行。
答案 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 ) )