2017-03-16 86 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