场景
数据存储在mysql数据库中。在一个离散的一段时间内(开始时间到结束时间),求出每隔一个小时,用户消费的金币。
这时,就需要将这一段时间以小时来分割了,然后groupby。
该怎么做呢。
实现
时间通常是 datetime 或 timestamp 。通过 DATE_FORMAT
,我们可以对时间进行分段。
比如:
%H
0-23小时
%S
00-59秒
所以可以这样:
select sum(coin), DATE_FORMAT(log_time, "%H") as h from gift_tb where log_time >= '2017-11-10 00:00:01' group by h
看起来是可以了。可是如果时间总长度大于1天呢。或是我需要30分钟来分割,10分钟来分割。这样显然是不行的。
好吧,路总是要人走的。
计算的根本还是时间,那不如将时间稍微处理下。
公式: floor( (记录时间 - 时间段的开始时间)/ (60 * 60) ) as h
于是就有了:
select sum(coin), floor((UNIX_TIMESTAMP(log_time) - 1510243200)/(60 * 60)) as h from gift_tb where log_time >= '2017-11-10 00:00:01' group by h