2017-01-25 104 views
0

請考慮以下查詢:MySQL的timeDiff測量返回意想不到的結果

SELECT submitted_time FROM jobs WHERE timediff(NOW(), submitted_time) < '24:00:00' 

我希望這回有包含時間戳,這是過去24小時內的「submitted_time」列中的所有行,不過我我收到了如下結果:

2017-01-18 14:58:34 
2017-01-16 14:58:34 

如果我運行查詢SELECT NOW()我得到2017-01-25 18:58:32

這似乎是正確的。

什麼是陌生人還是那個我在DB更近的行如:

2017-01-24 15:17:13 

正在被退回

我希望我做出了一個明顯的錯誤,有人可以指出,而不是開始瘋狂下降。

+0

您可以直接比較日期時間值和時間戳值。沒有理由以這種方式做timediff。在過去的24小時內只涉及查詢和使用DATE_ADD。看到這個:http://www.gizmola.com/blog/archives/51-Exploring-Mysql-CURDATE-and-NOW.-The-same-but-different..html – gview

+0

非常感謝我將採取的鏈接現在看看,看看我是否可以適應我的查詢,不幸的是MySql不是我的強項:) – Aphire

回答

1

只要是明確的,最簡單和可能最高效的處理這種方式

SELECT submitted_time FROM jobs WHERE submitted_time > DATE_ADD(NOW(), INTERVAL -1 DAY); 

(根據鏈接我在評論中提供)這應該是所有的工作在過去的24小時內,從字面上提交在查詢發佈的那一刻。

對於此查詢,這可能對您並不重要,但是無論何時將函數應用於表中的列,您可能擁有的任何索引都無法使用,因爲數據庫必須在每個值上運行函數表之前可以執行比較。

使用此方法可以計算出可比較的日期時間,並且mysql將使用submitted_time上的索引進行比較,假定該列已進行了適當索引。

+0

這很好,非常感謝。我當然會給你正確的答案,但是我會延遲幾天,看看這個問題是否引出任何人提出我的查詢爲什麼不起作用,爲什麼後人。 – Aphire

+0

您的原始嘗試的問題在比較中。 Timediff返回一個「時間」值。 '24:00:00'是一個字符串,不是時間值。爲了進行比較,您必須使用CAST('24:00:00'AS time)將字符串轉換爲時間值。當然這是非常混亂的,並且存在我提到的不使用索引的問題。 – gview

相關問題