开发中遇到过问题就是对时间以半个小时分钟分组,如统计08:00-08:30的人数,08:30-09:00的人数,貌似sql中没有这样的函数吧,直接从数据库里查出来,在java里分组也太low了吧
想到方法1 自定义函数,自己实现时间的半个小时转换,统计时调用函数
CREATE FUNCTION `date_half_hour_format`(in_date TIMESTAMP) RETURNS TIMESTAMP
BEGIN
DECLARE out_date TIMESTAMP;
DECLARE s_date VARCHAR(255);
DECLARE s_minute VARCHAR(2);
DECLARE int_minute INT;
SET s_minute = SUBSTRING(in_date, 15, 2);
SET int_minute = CAST(s_minute AS SIGNED);
IF int_minute <= 29 THEN
SET int_minute = 0;
SET s_date = CONCAT(LEFT(in_date, 14),'0',int_minute);
SET int_minute = 30;
SET s_date = CONCAT(LEFT(in_date, 14),int_minute);
END IF;
SET out_date = STR_TO_DATE(s_date,'%Y-%m-%d %H:%i');
RETURN out_date;
方法2 学过c语言更清楚c语言创建时间都是一个long的时间戳,可以对时间做除法运算,就是时间long的值除以30*60,这样就能得出半个小时的时间了,mysql中有函数unix_timestamp获取long的时间,从long转date的form_unixtime
SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(CURRENT_TIMESTAMP) DIV 1800)*1800)
这样就可以按任意时间分组了
select to_char((daybegin + (level - 1) * 5 / 1440), 'yyyy-mm-dd hh24:mi:ss') as newdaybegin
from (select (trunc(sysdate, 'dd')) as daybegin from dual)
connect by level <= 288
后面话单报表开发要用到,记录一下。
mysql不同时间粒度下的分组统计
我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以后使用。
在MySQL中,我的表为:track
数据结构如下所示:
比如按照五分钟的时间:
to_date(to_char(t.datatime, 'yyyy-mm-dd hh24')||':'||lpad(floor(to_char(t.datatime, 'mi')/5)*5,2,0) || ':00','yyyy-mm-dd hh24:mi:ss')
to_date(to_char(t.datatime, 'yyyy-mm-dd hh24'
#按照日期分组统计查询
SELECT
date_format(a.F_CREATE_TIME,"%Y-%m-%d") as time,count(distinct a.F_ID) as newcount,count(distinct b.F_ID) as bnewcount,count(distinct c.F_MSR_ID) as cnewcount
`t_zcgl_user` a
LEFT JOIN
`t_qb_gr_smrz` b ON da...
select toStartOfHour(created_at) time_interval , count(*) num from my_table group by toStartOfHour(created_at)
文档摘录:
toStartOfDay
将DateTime向前取整到今天的开始。
toStartOfHour
将DateTime向前取整到当前小时的开始。
toStartOfMinute
将DateTime向前取整到当前分钟的开...
sql按时间分段的逻辑是将某个时间段内的时间归一化到某个时间点,代码上表现得很清晰
按小时查询
SELECT COUNT(*), DATE_FORMAT(time ,'%Y-%m-%d %H:00:00') as time
FROM table
GROUP BY time
按分钟查询
SELECT COUNT(*), DATE_FORMAT(time ,'%Y-%m-%d %H:%i:00') as time
FROM table
GROUP BY time
按自定义分钟(如半小时)
SELECT CO