我在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. 更新數據庫記錄
- 3. Linq選擇比特定日期更新的所有記錄
- 4. Oracle:在特定日期後更新記錄
- 5. 按日期存儲數據庫記錄
- 6. 用戶特定的數據庫記錄
- 7. 更新數據庫中的記錄
- 8. 數據庫中的記錄更新
- 9. 日誌記錄數據庫行更改
- 10. 日期比較,以從MySQL數據庫與此PHP函數更新記錄
- 11. 數據庫記錄的事務日誌(批量更新)
- 12. 特定日期的數據
- 13. 特定日期的數據
- 14. 從特定日期選擇記錄
- 15. 更新日期數據庫,VB
- 16. 數據庫日誌記錄
- 17. 休眠不更新數據庫記錄
- 18. 更新SQL Server數據庫記錄
- 19. 更新記錄取決於日期
- 20. 核心數據 - 所有記錄的特定列更新
- 21. codeigniter更新特定的數據庫行
- 22. 更新數據庫時,所有記錄更新爲相同的值記錄
- 23. 更新數據庫記錄在SqlLite數據庫
- 24. 更新重複記錄,保留記錄(Min)(日期)相同
- 25. 定期更新Firebase數據庫
- 26. 定期用Java更新數據庫
- 27. 特定日期過後自動更新
- 28. JSP上點擊更新特定記錄
- 29. 使用WCF數據服務更新數據庫中的記錄
- 30. PHP - 更新/編輯數據庫表中的數據/記錄
是否可以在INSERT語句而不是查詢中添加規則? – wemm
將規則放在查詢中的重點是:查詢在'CURDATE()'反映的特定時間運行。您可以將規則構建到計算列(最近的MySQL版本)或VIEW中。但不是插入。 –
它是一個很好的解決方案,以添加此「選擇什麼,的dueDate, IF(的dueDate> = CURDATE()+間隔1天,1,0)is_overdue FROM表......」在事件運行一次在一天11:59?如果沒有,我到底需要添加此查詢以便在到期日期時更新記錄? – wemm