Mysql 高级SQL日期减法
我正在做一个游戏,跟踪你登录的时间。它将为数据库节省签入时间和签出日期 这是一个游戏,有点像抓国旗,我唯一不想让它做的就是用分数计算18:00(下午6点)到09:00(上午9点)之间的时间。这是每天的事,而不是一次 分数以秒为单位显示。Easly说这是入住和退房时间之间的差异(减去每天18:00-09:00之间的时间) 有人是高级SQL日期计算方面的专家,可以帮我吗?求你了 这是我的基本查询,没有时间减法:Mysql 高级SQL日期减法,mysql,date,Mysql,Date,我正在做一个游戏,跟踪你登录的时间。它将为数据库节省签入时间和签出日期 这是一个游戏,有点像抓国旗,我唯一不想让它做的就是用分数计算18:00(下午6点)到09:00(上午9点)之间的时间。这是每天的事,而不是一次 分数以秒为单位显示。Easly说这是入住和退房时间之间的差异(减去每天18:00-09:00之间的时间) 有人是高级SQL日期计算方面的专家,可以帮我吗?求你了 这是我的基本查询,没有时间减法: SELECT SUM(TIMESTAMPDIFF(SECOND,sessions.che
SELECT
SUM(TIMESTAMPDIFF(SECOND,sessions.checkin,IFNULL(sessions.checkout,NOW())))
AS score
FROM `sessions`
GROUP BY `user_id`
它不会很漂亮(如果您经常这样做的话,您可能需要添加一些以提高查询的可读性)
假设您没有跨越多天的登录,您可以执行以下操作
SELECT
user_id,
SUM(
TIMESTAMPDIFF(SECOND,
CASE
WHEN sessions.checkin < timestamp(date(sessions.checkin), maketime(9,0,0))
THEN timestamp(date(sessions.checkin), maketime(9,0,0))
WHEN sessions.checkin > timestamp(date(sessions.checkin), maketime(18,0,0))
THEN timestamp(date(sessions.checkin)+1, maketime(9,0,0))
ELSE
sessions.checkin
END,
CASE
WHEN IFNULL(sessions.checkout, now()) > timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
WHEN IFNULL(sessions.checkout, now()) < timestamp(date(IFNULL(sessions.checkout, now())), maketime(9,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now()))-1, maketime(18,0,0))
ELSE
IFNULL(sessions.checkout, now())
END)) AS score
FROM `sessions`
GROUP BY `user_id`
选择
用户id,
总数(
时间差(秒,
案例
当sessions.checkin<时间戳(日期(sessions.checkin),maketime(9,0,0))
然后是时间戳(日期(sessions.checkin),maketime(9,0,0))
当sessions.checkin>timestamp(日期(sessions.checkin),maketime(18,0,0))
然后是时间戳(日期(sessions.checkin)+1,maketime(9,0,0))
其他的
会话。签入
完,,
案例
当IFNULL(sessions.checkout,now())>时间戳(日期(IFNULL(sessions.checkout,now()))时,maketime(18,0,0))
然后是时间戳(日期(IFNULL(sessions.checkout,now()),maketime(18,0,0))
当IFNULL(sessions.checkout,now())
如果登录跨越多天,或者准确地说,查询可以与跨越多天的登录一起工作,例如第一天18:05签入,第三天8:55签出,则不起作用,但是,一旦它跨越多天的可数时间,计算就不会结束——对于跨越多天可数时间的每个记录,您需要从结果中减去不可数秒数。如果你需要帮助,请告诉我
上述查询的运行成本应该相对较低——考虑到您无论如何都要在整个表上运行它,因此它将进行表扫描,有大量重复计算和看起来庞大的事实应该没有那么重要。这些计算在内存中进行,不需要额外的I/O,并且应该比磁盘I/O快几个数量级(与原始查询的执行时间相比,让我们知道您是否会看到性能下降)。这必须完全在MySQL中进行,还是可以用您的编程语言进行?这听起来确实是一个非常复杂的查询。如果您愿意,也可以用php完成。。它能做到以下几点吗:计算18:00和09:00之间的差值,并将其与过去的天数相乘?我对您提供给我的脚本进行了一些修改,它能工作!谢谢你,伙计。我必须说,这只是一个较大查询的子查询。现在它是巨大的。哈哈,但没问题!