Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 高级SQL日期减法_Mysql_Date - Fatal编程技术网

Mysql 高级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

我正在做一个游戏,跟踪你登录的时间。它将为数据库节省签入时间和签出日期

这是一个游戏,有点像抓国旗,我唯一不想让它做的就是用分数计算18:00(下午6点)到09:00(上午9点)之间的时间。这是每天的事,而不是一次

分数以秒为单位显示。Easly说这是入住和退房时间之间的差异(减去每天18:00-09:00之间的时间)

有人是高级SQL日期计算方面的专家,可以帮我吗?求你了

这是我的基本查询,没有时间减法:

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之间的差值,并将其与过去的天数相乘?我对您提供给我的脚本进行了一些修改,它能工作!谢谢你,伙计。我必须说,这只是一个较大查询的子查询。现在它是巨大的。哈哈,但没问题!