我已在這裏給出的答案,並拿出了以下數據庫結構:
Column Data Type
id int
task_name nvarchar(50)
frequency_type nvarchar(10)
runat_day int
runat_month int
runat_year int
的數據是這樣的:
id task_name frequency_type runat_day runat_month runat_year
1 Do this Once once 16 2 2018
2 Do this Monthly monthly 31 0 0
3 Do this Yearly yearly 28 2 0
4 Do this Daily daily 0 0 0
5 Do this Weekly weekly 6 0 0
查詢拉把數據傳回了看起來是這樣的:
DECLARE @chosen_date datetime = '2018-02-28'
DECLARE @lastDayOfMonth int = datePart(d,dateadd(s,-1,dateadd(mm, datediff(m,0,getdate())+1,0)))
select task_name
from scheduled_tasks
where (frequency_type = 'once' and runat_day = DATEPART(DAY, @chosen_date) and runat_month = DATEPART(MONTH, @chosen_date) and runat_year = DATEPART(YEAR, @chosen_date))
or frequency_type = 'daily'
or (frequency_type = 'weekly' and runat_day = DATEPART(WEEKDAY,@chosen_date))
or (frequency_type = 'monthly' and runat_day = DATEPART(DAY, @chosen_date))
or (frequency_type = 'monthly' and @lastDayOfMonth = DATEPART(DAY, @chosen_date) and runat_day >= @lastDayOfMonth)
or (frequency_type = 'yearly' and runat_day = DATEPART(DAY, @chosen_date) and runat_month = DATEPART(MONTH, @chosen_date))
到目前爲止,我所有的用例都拿出正確,甚至最終落在了一天,不指定月份的正確處理存在一個月的日期(例如每月31日仍將在2月28日觸發)
給定frequency_type不需要的字段只有零個或空值,並且被查詢忽略。
它沒有考慮到閏年2月29日發生的年度事件,也沒有考慮以任何方式考慮時間。
每月 - 如果你設置一個天數,你不能處理31個月,甚至2月份的30和29。你需要更復雜的邏輯嗎? – Serg
對於這些情況,我的邏輯是,如果任務設置爲第31,並且該月有30,29或28天,則使用該月的最後一天。 – Craig
@克雷格對於賞金來說足夠好嗎? – Lance