我在MYSQL數據庫中有一個名爲「dueDate
」的屬性。我想在11:59PM
的截止日期更新記錄。 有沒有辦法創建一個event
或cronjob
可以做到這一點?更新特定日期的數據庫記錄
2
A
回答
2
如果您的系統管理允許您使用任一設施,您可以在任何特定時間設置事件或cronjob。查看如何創建MySQL重複事件很容易。
但這是一個脆方式處理您的業務規則中的時間依賴關係。我的意思是「脆弱」?首先,如果出現問題並且工作不運行,您的業務規則就會被玷污並需要修復。另一件事,cronjobs和事件在一天中的精確時間運行,他們在當天的時間或之後運行。他們可能需要一段時間才能開始。
所以,我建議你在查詢中使用規則來執行你的業務規則。例如,假設您的原始願望是在截止日期結束時將名爲is_overdue
的列設置爲1
。相反,使用這樣的查詢來計算您的is_overdue
列。
SELECT whatever, dueDate,
IF(dueDate >= CURDATE() + INTERVAL 1 DAY, 1, 0) is_overdue
FROM table ...
這樣做的優勢在於,它將永遠是正確的,精確到毫秒,並且將不依賴於脆性後臺作業的運行。
事件和cronjobs更好地用於清除陳舊記錄。例如,您可以通過在其中使用這種查詢來擺脫已經過期30天或更長時間的任何記錄。
DELETE FROM table WHERE dueDate <= CURDATE() - INTERVAL 30 DAY
如果您的cronjob /事件無法在某一天運行,第二天的運行依然會做正確的清理。
編輯。這個建議的要點是計算時間依賴列(在本例中爲is_expired
)。如果你遵循這個建議,你根本不會更新表格。相反,只要您檢索is_expired
值,就會使用建議的查詢。
專業提示。當你想在某個特定日子的最後一刻<=
做某件事時,你最好在第二天的第一時刻<
。也就是說,爲獲得最佳效果的地方
WHERE dueDate <= '2017-11-17 23:59:59'
爲什麼要用
WHERE dueDate < '2017-11-17' + INTERVAL 1 DAY
?一天中的最後一刻很難準確表達,特別是如果您的系統使用亞秒級精度進行計時。但一天中的第一時刻很容易表達。
相關問題
- 1. 在特定日期和時間更改數據庫記錄的值
- 2. 定期更新的bigquery數據庫中的記錄順序
- 3. 更新數據庫記錄
- 4. 更新數據庫記錄
- 5. Moodle SQL更新數據庫中的特定記錄不工作
- 6. Linq選擇比特定日期更新的所有記錄
- 7. Oracle:在特定日期後更新記錄
- 8. 按日期列出數據庫記錄
- 9. 按日期存儲數據庫記錄
- 10. 用戶特定的數據庫記錄
- 11. Mysql獲取特定日期的記錄
- 12. 更新數據庫中的記錄
- 13. 數據庫中的記錄更新
- 14. 更新數據庫中的記錄
- 15. 日誌記錄數據庫行更改
- 16. 日期比較,以從MySQL數據庫與此PHP函數更新記錄
- 17. Oracle數據庫特定日期
- 18. 存儲和更新本地存儲中的當前日期數據庫記錄
- 19. laravel 4的獨特規則對更新數據庫記錄
- 20. 數據庫記錄的事務日誌(批量更新)
- 21. 特定日期的數據
- 22. 特定日期的數據
- 23. 從特定日期獲得記錄
- 24. 從特定日期選擇記錄
- 25. PHP-SQL:日期不更新數據庫
- 26. 更新日期數據庫,VB
- 27. mysql數據庫更新日期
- 28. 數據庫日誌記錄
- 29. 休眠不更新數據庫記錄
- 30. 更新JobExecution數據庫記錄在afterJob()
是否可以在INSERT語句而不是查詢中添加規則? – wemm
將規則放在查詢中的重點是:查詢在'CURDATE()'反映的特定時間運行。您可以將規則構建到計算列(最近的MySQL版本)或VIEW中。但不是插入。 –
它是一個很好的解決方案,以添加此「選擇什麼,的dueDate, IF(的dueDate> = CURDATE()+間隔1天,1,0)is_overdue FROM表......」在事件運行一次在一天11:59?如果沒有,我到底需要添加此查詢以便在到期日期時更新記錄? – wemm