:SQL Server的日期邏輯 - 尋找考慮下面的數據庫表中的下一個提醒日期
StartDate DATETIME -- day that the reminder period starts
LastReminderDate DATETIME -- the last time the reminder triggered
DayOfMonth INT -- the day of the month to remind the user
Interval INT -- how often in months to remind the user
我怎樣才能找出基於這些值的下一個提醒日期?例如:
StartDate = '6/1/2011'
LastReminderDate = '6/5/2011'
DayOfMonth = 5 -- remind on the 5th of the month
Interval = 2 -- remind every other month
對於這個特殊的例子,接下來的提醒日期應該是2011/8/5,因爲它提醒在每月每兩個月的第5位。我如何編寫一個函數來解決這個問題?
如果LastReminderDate爲NULL,則LastReminderDate應等於STARTDATE
UPDATE:
StartDate = '6/1/2011'
LastReminderDate = NULL
DayOfMonth = 5
Interval = 2
在這種情況下,沒有最後提醒日期。第一次提醒將發生在2011年6月5日。下面的解決方案似乎在這種情況下返回8/5。
下面是一些具體的規則:
- 提醒應始終對任何DAYOFMONTH是發生。如果DayOfMonth在給定的月份內是非法的,那麼它應該是該月的最後一天。例如......如果DayOfMonth是31,下一個提醒日期將在6月31日,那麼應該是6月30日。
- 下一個提醒日期應始終基於最後提醒日期加上間隔。如果最後提醒日期與月份的日期不符,那麼它可能會超過間隔時間。例如...如果最後提醒是2011年6月1日,間隔時間是2個月,但提醒是在本月20日,則下次提醒將爲2011年8月20日。
- 如果沒有上次提醒日期,則使用開始日期而不是上次提醒日期...但這會使用未來最早的日期。如果開始日期是2011年6月1日,而月中的某天是5,那麼2011年7月5日以後這將是2011年7月5日。如果月的一天是25那麼這將是2011年6月25日
如果開始日期是2011年6月14日而DayOfMonth = 7應該是2011年7月7日或2011年6月7日如果DayOfMonth = 31應該怎麼辦它假定每月的第一天或最後一天還是應該炸燬?您需要讓我們知道規則是什麼,而不是僅僅挑選輸入和輸出值 –