记录日志表
有字段登录时间,退出时间,帐号
要实现查询某段时间内的登录人数,并且按每5分钟分组查询,就是显示在该时间段内每五分钟有多少人登录select count(*),TIMESTAMPDIFF(MINUTE,l.login,l.logout) from t_user_log l
where l.login>=date_format('2011-01-22','%Y-%c-%d') and l.logout<=SYSDATE()
GROUP BY TIMESTAMPDIFF(MINUTE,l.login,l.logout)/5 这是我自己写的sql查询语句,但是查询出来的结果不正确,关键不知道每5分钟分组查询条件该怎么写
会的请指教下,折腾了半天了,是函数用2错了还是思路错了?谢谢
有字段登录时间,退出时间,帐号
要实现查询某段时间内的登录人数,并且按每5分钟分组查询,就是显示在该时间段内每五分钟有多少人登录select count(*),TIMESTAMPDIFF(MINUTE,l.login,l.logout) from t_user_log l
where l.login>=date_format('2011-01-22','%Y-%c-%d') and l.logout<=SYSDATE()
GROUP BY TIMESTAMPDIFF(MINUTE,l.login,l.logout)/5 这是我自己写的sql查询语句,但是查询出来的结果不正确,关键不知道每5分钟分组查询条件该怎么写
会的请指教下,折腾了半天了,是函数用2错了还是思路错了?谢谢
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
CREATE TABLE `tb_user_login` (
`user_id` varchar(20),
`login_time` timestamp,
`logout_time` timestamp
) ENGINE=InnoDB DEFAULT CHARSET=utf8DELIMITER $$USE `testdb`$$DROP PROCEDURE IF EXISTS `pr_insert_time_dura`$$CREATE DEFINER=`sd_prod`@`localhost` PROCEDURE `pr_insert_time_dura`( IN iBegin_time TIMESTAMP, -- 开始时间
IN iEnd_time TIMESTAMP, -- 结束时间 IN iDura INT, -- 统计间隔(分钟)
OUT oRowCount INT
)
SQL SECURITY INVOKER
BEGIN
/*
declare vBegin_time TIMESTAMP;
DECLARE vEnd_time TIMESTAMP;
declare XX TIMESTAMP;
declare vCount int; */
SET @vBegin_time = SUBDATE(iBegin_time, INTERVAL iDura MINUTE);
SET @vEnd_time = SUBDATE(iEnd_time, INTERVAL iDura MINUTE);
SET @XX = @vBegin_time;
SET @vCount = 0;
-- 创建临时表
DROP TABLE IF EXISTS tb_time_dura; CREATE TABLE tb_time_dura(begin_time TIMESTAMP, end_time TIMESTAMP);
WHILE @XX < @vEnd_time
DO
INSERT INTO tb_time_dura(begin_time,end_time)
SELECT @XX := ADDDATE(@XX,INTERVAL iDura MINUTE) BEGIN_TIME,
@YY := SUBDATE(ADDDATE(@XX,INTERVAL iDura MINUTE),INTERVAL 1 SECOND) END_TIME
FROM DUAL;
SET @vCount = @vCount + 1;
END WHILE;
SET @oRowCount = @vCount; -- 可以内连接、左连接
SELECT a.begin_time, a.end_time, COUNT(b.user_id) AS User_count FROM tb_time_dura a LEFT JOIN tb_user_login b ON (b.login_time BETWEEN a.begin_time AND a.end_time) GROUP BY a.begin_time, a.end_time;
END$$DELIMITER ;-- 从2013-4-25 00:00:00开始,至2013-4-27 00:00:00结束,统计间隔为60分钟一次
CALL pr_insert_time_dura('2013-4-25','2013-4-27',60, @rowcount);
不知道是否符合楼主的要求