UPDATE列,其中timediff大于5分钟

时间:2017-03-16 10:35:36

标签: mysql session

我有一个表(会话),它有2列我必须用于此查询。 Session_Active(这是一个tinyInt)和Last_active(这是一个日期时间)。

我想创建一个查询,计算现在和' Last_active'之间的时差。对于所有表格,会话活动'是的,如果它超过5分钟就应该改变会话活动'。

这是我所拥有的部分:

public var licenseStart: Date {
    set {
        willChangeValueForKey("licenseStart")
        setPrimitiveValue(newValue, forKey: "licenseStart")
        status = licenseStart.doubleValue / 1000 < Date().timeIntervalSince1970 ? 0 : 1
        didChangeValueForKey("licenseStart")
    }
    get {
        willAccessValueForKey("licenseStart")
        let date = primitiveValueForKey("licenseStart") as? Date
        didAccessValueForKey("licenseStart")
        return date
    }
}

我完全不知道如何检查差异是否大于5分钟,我也不知道SELECT timediff(now(), `Last_Active`) from sessions WHERE `Session_Active` = true; 的位置/方式(如果差异是5分钟或更长)

提前致谢! (:

2 个答案:

答案 0 :(得分:2)

您可以使用DATE_SUB使用以下解决方案:

UPDATE sessions SET `Session_Active` = 0
WHERE `Last_Active` <= DATE_SUB(NOW(), INTERVAL 5 MINUTE)
    AND `Session_Active` = 1

您想使用时间戳解决方案吗?

您可以使用TIMESTAMPDIFF

UPDATE sessions SET `Session_Active` = 0
WHERE TIMESTAMPDIFF(MINUTE, `Last_Active`, NOW()) >= 5
    AND `Session_Active` = 1
  

注意:使用TIMESTAMP时应该小心!一些信息,您不应该使用TIMESTAMPhttps://stackoverflow.com/a/35469149/3840840。在此答案中,引用了this article来描述DATETIMETIMESTAMPINT的效果。

     

TIMESTAMP解决方案仅在2038年之前有效。这将由Year 2038 problem引起。

     

对这个问题以及2038年发生的事情的一个非常好的解释:https://stackoverflow.com/a/2012620/3840840

答案 1 :(得分:0)

您可以使用 UNIX_TIMESTAMP(date)

当使用日期参数调用UNIX_TIMESTAMP()时,它会返回自1970-01-01 00:00:00 UTC以来的参数值。 date参数可以是DATE,DATETIME或TIMESTAMP字符串,也可以是YYMMDD,YYMMDDHMMSS,YYYYMMDD或YYYYMMDDHHMMSS格式的数字。服务器将日期解释为当前时区中的值,并将其转换为UTC的内部值。 这比大表集上的DATE_SUB要快。

UPDATE sessions 
 SET `Session_Active` = 0
  WHERE UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(`Last_Active`) > 300
  AND `Session_Active` = 1