從數據庫的角度來看,什麼是最好的實現/設計考慮以下幾點:數據庫設計爲定期日曆事件具有無窮
定期日曆是無限的(沒有結束日期)事件?顯然,爲每個事件填充數據庫記錄是沒有意義的!
創建週期性事件之後,編輯單個事件以打破重複性規則的最佳方法是什麼?例如,「每週一上午9:00」,但有一個特定的星期一需要在上午10:00開始。
從數據庫的角度來看,什麼是最好的實現/設計考慮以下幾點:數據庫設計爲定期日曆事件具有無窮
定期日曆是無限的(沒有結束日期)事件?顯然,爲每個事件填充數據庫記錄是沒有意義的!
創建週期性事件之後,編輯單個事件以打破重複性規則的最佳方法是什麼?例如,「每週一上午9:00」,但有一個特定的星期一需要在上午10:00開始。
很難在絕對沒有細節的情況下建議更改架構,但這裏有一種方法。你所擁有的是一個條目,「從這個日期開始,會議時間就在這一天。」
EffDate DOW Time
01/01/2017 Mon 0900
03/14/2017 Mon 1000
03/21/2017 Mon 0900
從時間表的第一天1月1日開始,會議在星期一上午9點舉行。然後,從星期二開始生效之前,下週一(20日)的會議將在上午10點舉行。會議時間從21日再次開始,恢復到上午9點。
使這項工作看起來有點複雜的查詢,但按照邏輯,它應該是顯而易見的。
select Dow "Day of meeting", Time
from MeetingSchedule ms
where ms.EffDate =(
select Max(ms1.EffDate)
from MeetingSchedule ms1
where ms1.EffDate <= Today()
);
如果該查詢僅僅是3月14日(這是一個星期二)前執行任何時間1月1日或之後,回報率將在週一上午9點顯示。從第二天開始,整整一週,回報將於週一上午10點播出。然後從第二天開始(從那時起),時間將再次顯示上午9點。
當然,您可能想知道在任何給定的星期一的會議時間。日期將進入一個變量,它將替換返回執行日期的函數。
select :DateOfInterest "Week starting", Dow "Day of meeting", Time
from MeetingSchedule ms
where ms.EffDate =(
select Max(ms1.EffDate)
from MeetingSchedule ms1
where ms1.EffDate <= :DateOfInterest
);
假設你通過一個循環生成連續週日的日期,輸出應該是這樣的三月份:
Week starting Day of meeting Time
03/05/2017 Mon 0900
03/12/2017 Mon 0900
03/19/2017 Mon 1000
03/26/2017 Mon 0900
但正確答案將獲得的日期之後在會議舉行日期之前的最後一次會議。如果時間從此變爲上午10點,只需消除最後一行,即可將其恢復至上午9點。
我添加了星期幾,但如果您知道會議絕對會始終在星期一,您可以不發表。