我有一个表(会话),它有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分钟或更长)
提前致谢! (:
答案 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
时应该小心!一些信息,您不应该使用TIMESTAMP
:https://stackoverflow.com/a/35469149/3840840。在此答案中,引用了this article来描述DATETIME
,TIMESTAMP
和INT
的效果。
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