Ich möchte basierend auf dem Wochentag und der Nummer des Auftretens im Monat eines Datums eine Liste von Daten für jeden Monat zwischen zwei Daten generieren. Unter der Annahme, habe ich eine @StartDate = 2016/04/01
und @EndDate = 2016/09/01
, ich überprüfen, ob @StartDate
auf einem ersten Freitag im April, dann zu @EndDate
wird Termine für alle ersten Freitag eines jeden Monats erstellen:Liste der Daten basierend auf dem Tag und dem Vorkommen des Monats erstellen
2016/05/06
2016/06/03
2016/07/01
2016/08/05
Bei @StartDate = 2016/04/12
und @EndDate = 2016/09/01
stelle ich fest, dass die @StartDate
der zweite Dienstag im April ist, ging dann jeden zweiten Dienstag Dienstag jeden Monat zu erhalten:
2016/05/10
2016/06/14
2016/07/12
2016/08/09
bei @StartDate = 2016/04/28
und @EndDate = 2016/09/01
stellt ich fest, dass die @StartDate
auf der l ast Donnerstag des Monats April:
2016/05/26
2016/06/30
2016/07/28
2016/08/25
Im letzten Fall, ich brauche die Anzahl der Wochen eines jeden Monats, um zu überprüfen, weil Monate gibt es nur bei 4 Wochen mit 5 Wochen, und ich möchte das letzte Vorkommen.
Was habe ich getan? Ich einen Code gefunden, der mich jeden Montag in der dritten Woche des Monats gibt, und ich nahm eine wenig ein @StartDate
und @EndDate
zu erhalten:
;with
filler as (select row_number() over (order by a) a from (select top 100 1 as a from syscolumns) a cross join (select top 100 1 as b from syscolumns) b),
dates as (select dateadd(month, a-1, @StartDate) date from filler where a <= 1000 and dateadd(month, a-1, @StartDate) < @EndDate),
FirstMonday as (
select dateadd(day, case datepart(weekday,Date) /*this is the case where verify the week day*/
when 1 then 1
when 2 then 0
when 3 then 6
when 4 then 5
when 5 then 4
when 6 then 3
when 7 then 2
end, Date) as Date
,case when datepart(weekday, @StartDate) = 1 then 3 else 2 end as Weeks /*here i verify the number of weeks to sum in the next date*/
from dates
)
select dateadd(week, Weeks, Date) as ThirdMonday
from FirstMonday
sind Ihre Regeln nicht eindeutig. Wie unterscheiden Sie zwischen dem vierten Montag eines Monats und dem letzten Montag? –
@GordonLinoff Sie sprechen über den Code? Ich muss es anpassen, um dies zu tun – CesarMiguel
Haben Sie in Betracht gezogen, eine [Kalendertabelle] (https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql -Server/)? Aus einer vollständigen Liste aller Daten, einschließlich Wochentage und Wochennummern, können Sie immer nur die gewünschten Daten filtern. –