2017-12-18 439 views
2

我在MYSQL數據庫中有一個名爲「dueDate」的屬性。我想在11:59PM的截止日期更新記錄。 有沒有辦法創建一個eventcronjob可以做到這一點?更新特定日期的數據庫記錄

回答

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 

?一天中的最後一刻很難準確表達,特別是如果您的系統使用亞秒級精度進行計時。但一天中的第一時刻很容易表達。

+0

是否可以在INSERT語句而不是查詢中添加規則? – wemm

+0

將規則放在查詢中的重點是:查詢在'CURDATE()'反映的特定時間運行。您可以將規則構建到計算列(最近的MySQL版本)或VIEW中。但不是插入。 –

+0

它是一個很好的解決方案,以添加此「選擇什麼,的dueDate, IF(的dueDate> = CURDATE()+間隔1天,1,0)is_overdue FROM表......」在事件運行一次在一天11:59?如果沒有,我到底需要添加此查詢以便在到期日期時更新記錄? – wemm