我有一个表(会话),其中有两个列,我必须在这个查询中使用它们。Session_Active (是一个tinyInt)和Last_active(是一个日期时间)。
我想要创建一个查询,为所有表计算“Last_active”和“Session_Active”之间的时间差,如果时间大于5分钟,则应该更改“Session_Active”。
这是我工作的部分:
SELECT timediff(now(), `Last_Active`) from sessions WHERE `Session_Active` = true;我一点也不知道如何检查差异是否大于5分钟,也不知道如何放置UPDATE Session_Active = false (如果差值大于5分钟)。
提前谢谢!(:
发布于 2017-03-16 10:43:31
您可以使用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的信息。在这个答案中,有一个对这篇文章的引用,描述了DATETIME、TIMESTAMP和INT的性能。TIMESTAMP解决方案直到2038年才开始工作。这将由2038年问题引起。 很好地解释了这个问题和2038年发生的事情:https://stackoverflow.com/a/2012620/3840840
发布于 2017-03-16 10:43:01
您可以使用UNIX
当使用date参数调用UNIX_TIMESTAMP()时,它以秒的形式返回参数的值,自'1970-01-01 00:00:00‘UTC开始。日期参数可以是日期、日期时间或时间戳字符串,也可以是YYMMDD、YYMMDDHHMMSS、YYYYMMDD或YYYYMMDDHHMMSS格式的数字。服务器将日期解释为当前时区中的值,并将其转换为UTC中的内部值。--这比大表集上的DATE_SUB快.
UPDATE sessions
SET `Session_Active` = 0
WHERE UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(`Last_Active`) > 300
AND `Session_Active` = 1https://stackoverflow.com/questions/42831585
复制相似问题