mysql datetime类型处理计算时间差
数据库 与上面有所差距 下面的查询没带时间查询 想要满足上面一段时间查询 只需要带上where 就好
第一个sql
select id,userid,count(*) as loginnum,sum(TIMESTAMPDIFF(MINUTE,logintime, logouttime)) as times from log group by userid;
第2个sql 第二个没看懂 也不知道做的方法是否有问题 思路既然5个等级一组 那么除以5 再向下取整
select id,userid,level, floor(level/5) as lv from log group by userid;
结果分析 如下 每5级 那么0-4级 是一组 虽然没有0级 但是0-4级 其实没必要统计 因为游戏里 大概都是比如地图90-94
95-99 这样分 95级以上可以进入 那么94级 是不可以进入的 所以按照这个思路来看 那么0-4 基本上不受影响
上面所有查询都没加 时间判断 如果相满足一段时间查询 那么就 where logintime > 'xxxxxx' and logouttime < 'xxxxxx'
比如 select id,userid,level, floor(level/5) as lv from log where logintime > '2018-04-09 01:01:01' and logouttime < '2018-08-09 01:01:01' group by userid ;
下面这样写会更好
select id,userid,level, floor(level/5) as lv from log where unix_timestamp(logintime) >unix_timestamp( '2018-04-01 01:01:01') and unix_timestamp(logouttime) < unix_timestamp('2018-05-09 01:01:01') group by userid ;
参考文章
https://www.cnblogs.com/nick-huang/p/4447717.html
随记MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date)
1. 时间差函数(TIMESTAMPDIFF、DATEDIFF)
需要用MySQL计算时间差,使用TIMESTAMPDIFF、DATEDIFF,记录一下实验结果
--0 select datediff(now(), now()); --2 select datediff('2015-04-22 23:59:00', '2015-04-20 00:00:00'); --2 select datediff('2015-04-22 00:00:00', '2015-04-20 23:59:00'); --1 select TIMESTAMPDIFF(DAY, '2015-04-20 23:59:00', '2015-04-22 00:00:00'); --2 select TIMESTAMPDIFF(DAY, '2015-04-20 00:00:00', '2015-04-22 00:00:00'); --2 select TIMESTAMPDIFF(DAY, '2015-04-20 00:00:00', '2015-04-22 12:00:00'); --2 select TIMESTAMPDIFF(DAY, '2015-04-20 00:00:00', '2015-04-22 23:59:00'); --71 select TIMESTAMPDIFF(HOUR, '2015-04-20 00:00:00', '2015-04-22 23:00:00'); --4260 select TIMESTAMPDIFF(MINUTE, '2015-04-20 00:00:00', '2015-04-22 23:00:00');
关于TIMESTAMPDIFF描述,见http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timestampdiff
如需知道TIMESTAMPDIFF还能以哪些单位返回数据,可参考TIMESTAMPADD的描述:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timestampadd
2. 日期转换计算函数(date_add、day、date_format、str_to_date)
-- 用日期与字符串转换,计算当月第一天、下月第一天 select curdate() as '当前日期', DATE_FORMAT(curdate(), '%Y-%m') as '当前月份', str_to_date(concat(DATE_FORMAT(curdate(), '%Y-%m'), '-01'), '%Y-%m-%d') as '当前月的第一天', date_add(str_to_date(concat(DATE_FORMAT(curdate(), '%Y-%m'), '-01'), '%Y-%m-%d'), interval 1 month) as '下月的第一天'; -- 当前月的最后一天 select last_day(curdate()); -- 下月第一天 select date_add(last_day(curdate()), interval 1 day); -- 当天为当月的第几天 select day(curdate()); -- 当月第一天 select date_add(curdate(), interval 1-(day(curdate())) day);