2017-03-16 82 views
2

我有一个表(会话)有2列,我必须使用此查询。 Session_Active(这是一个tinyInt)和Last_active(这是一个日期时间)。更新列where timediff大于5分钟

我想创建一个查询来计算现在和'Last_active'之间所有表的WHERE'Session_Active'为真的时间差,如果它超过5分钟,它应该改变'Session_Active'。

这是工作,我有一部分:我不知道在所有的我怎么能检查,如果差大于5分钟,我也不知道

SELECT timediff(now(), `Last_Active`) from sessions WHERE `Session_Active` = true; 

哪里/如何把UPDATE Session_Active = false(如果差异是5分钟或更多)

在此先感谢! (:

回答

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

+0

这个答案适用于我,我只需要将MINUTES更改为MINUTE。也许MINUTES适用于较旧的mysql版本? – JeroenM

+0

@JeroenM - 这就是我的错误,我也添加了一个简单的时间戳解决方案 –

+0

谢谢!为什么会使用时间戳解决方案,如果它可能会导致问题,即使2038仍然很远? – JeroenM

0

您可以使用UNIX_TIMESTAMP(date)

当UNIX_TIMESTAMP()被调用的日期参数,它返回因为“1970-01-01 00:00:00” UTC的说法是秒的值。date参数可以是DATE,DATETIME或TIMESTAMP字符串,也可以是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` = 1 
+0

谢谢,这个答案的作品以及。在我接受另一个之后的几秒钟内,你用一个很好的解释更新你的答案。从长远来看,表格集可能确实变得很大,所以这就是为什么这个答案对我来说比另一个更有用,尽管欣赏塞巴斯蒂安的答案也是如此。谢谢你们(: – JeroenM

+0

@Anril - 很难相信将DATETIME转换成TIMESTAMP后计算速度比DATE_SUB快。请参阅以下答案:http://stackoverflow.com/a/35469149/3840840。你能否展示一些基准确认这一点? - 而且这个解决方案只能在2038年前工作!DATE_SUB工作到9999。 –

+0

@SebastianBrosch,我正在用知识(基于经验也)在查询中“避免函数”,你对Unix千年问题有一个强有力的观点,你的答案更适合我,现在毫无疑问我现在已经+1了。 – Anil