2017-03-16 35 views
1

從數據庫的角度來看,什麼是最好的實現/設計考慮以下幾點:數據庫設計爲定期日曆事件具有無窮

  1. 定期日曆是無限的(沒有結束日期)事件?顯然,爲每個事件填充數據庫記錄是沒有意義的!

  2. 創建週期性事件之後,編輯單個事件以打破重複性規則的最佳方法是什麼?例如,「每週一上午9:00」,但有一個特定的星期一需要在上午10:00開始。

回答

0

很難在絕對沒有細節的情況下建議更改架構,但這裏有一種方法。你所擁有的是一個條目,「從這個日期開始,會議時間就在這一天。」

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點。

我添加了星期幾,但如果您知道會議絕對會始終在星期一,您可以不發表。