2017-06-14 77 views
-1

我有一個簡單的表,在下面的例子中有一個名爲timeC的TIME列。我想選擇所有timeC在過去五分鐘內的記錄。我嘗試了以下和許多變化沒有成功。MySQL中TIME字段的最近記錄

SELECT * FROM sample_schema.`exampleTable` 
WHERE MINUTE(TIMEDIFF(SELECT TIME(NOW())), `timeC`)<5; 

請注意,列是TIME,而不是DATETIME或TIMESTAMP。

對此提出建議?

+2

由於'TIME'類型只包含時間,即不知道它屬於哪個日期,所以我不確定你想要查詢什麼,真的:) – AKX

+0

@akx,這個問題受到限制,使得被檢查的記錄總是從查詢運行當天的較早時刻開始。 –

回答

1

你的圓括號在錯誤的地方。所以你用1個參數調用TIMEDIFF(),並用2個參數調用MINUTE()。此外,您不需要使用SELECT來獲得TIME(NOW()),您可以將該函數調用用作參數。

SELECT * 
FROM exampleTable 
WHERE MINUTE(TIMEDIFF(TIME(NOW()), timeC)) < 5 

但是,這仍然存在問題。 TIMEDIFF()如果timeC當天晚些時候可以返回負值時間,但MINUTE()總是返回分鐘的正值,所以這將匹配5分鐘前到5分鐘後的任何值。簡單地將時間與範圍進行比較會更好:

SELECT * 
FROM exampleTable 
WHERE timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW()) 

有一個重要問題。如果您在午夜後不久執行此查詢,則提前5分鐘的時間將比前一天晚。例如,如果它當前是00:02,則提前5分鐘將是23:57,並且沒有任何內容會與BETWEEN表達式匹配。你需要檢查:

SELECT * 
FROM exampleTable 
WHERE CASE 
    WHEN TIME(NOW()) >= '00:05' 
     THEN timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW()) 
    ELSE timeC BETWEEN '00:00' AND TIME(NOW()) 
     OR 
     timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND '23:59:59' 
    END