這可能過於本地化,但希望可能有一些信息在那裏,我根本無法找到。DATE_SUB和INTERVAL計算可能是錯誤的
背景:我們有一個帶有兩個獨立Java守護進程的系統;一個創建數據並插入到數據庫中,另一個獲取最新的數據集(不超過1個小時),並推送到客戶端。
問題:從此表中抓取的數據偶爾會大於1小時。時差可以在2小時到幾個月之間。
當前查詢:獲取1小時數據是一個兩步過程。首先,我們的「後備」通過設置一個隨機負數一組記錄:
UPDATE tracking_records as target
JOIN
(SELECT tracking_records.id, `set`, unit_id, tracking_records.record_time
FROM tracking_records
WHERE `set` IS NULL and record_time > DATE_SUB(NOW(), INTERVAL 1 HOUR)
ORDER BY record_time DESC LIMIT 48) source
ON source.id = target.id
SET target.`set` = -1371504452;
注:-1371504452
是一個示例值;它是在Java中隨機生成的。每個查詢的LIMIT 48
保持不變。
然後我們只需選擇包含那個隨機set
值的列。
這是tracking_records
表的結構:
+-------------+---------------------+
| Field | Type |
+-------------+---------------------+
| id | bigint(20) unsigned |
| unit_id | int(11) |
| record_time | datetime |
| latitude | int(11) |
| longitude | int(11) |
| created_at | datetime |
| updated_at | datetime |
| set | int(11) |
+-------------+---------------------+
正如你所看到的,查詢應該只匹配記錄中,其中set
欄爲空並且其中記錄時間是在1小時前。
如前所述,我檢測到幾個小時的時間差異,最長爲幾個月(迄今爲止檢測到的最老的是2013-09-23 11:01:08
)。考慮到WHERE子句的時間限制,這對我來說沒有意義。
我們使用的MySQL版本5.5.29-0ubuntu0.12.04.2
問:我很困惑,我想知道,如果有一個錯誤,或者其他問題而會導致時間計算失敗如此劇烈和隨機。要麼是這樣,要麼是查詢本身存在問題,我根本沒有看到。
有沒有人在這個版本的MySQL中觀察到錯誤的時間比較,DATE_SUB()
函數或INTERVAL
計算的問題,這可能解釋我看到的異常時間?
99%的時間,當你使用一個行之有效的工具時,問題不在於工具,而在於用戶。你確定'record_time'是'DATETIME'的值,而不僅僅是時間(以小時爲單位,而不是幾小時,幾天,幾個月,幾年......)?它是否可以在任何時候更新? – Floris
@Floris是的,'record_time'總是一個'datetime',包含正確的日期和時間值,並按照這樣輸入。我再次檢查以確認。檢測這樣的問題很容易。不,在這種情況下,輸入「record_time」的值永遠不會改變。守護進程中沒有其他更新語句。唯一被操縱的列是'set'列。 –
我希望確保在進行選擇之前沒有隨機值的條目已經存在。爲什麼不總是使用相同的值?首先,將所有'1'值設置爲'0';然後將你需要的記錄設置爲'1'。 – Floris