Write the Code. Change the World.

11月 11

场景

数据存储在mysql数据库中。在一个离散的一段时间内(开始时间到结束时间),求出每隔一个小时,用户消费的金币。

这时,就需要将这一段时间以小时来分割了,然后groupby。

该怎么做呢。

实现

时间通常是 datetimetimestamp 。通过 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

参考

http://www.w3school.com.cn/sql/func_date_format.asp

http://blog.csdn.net/zhuyu_deng/article/details/43409547