【发布时间】:2016-04-01 11:33:23
【问题描述】:
我想根据日期的星期几和月份中出现的次数生成两个日期之间每个月的日期列表。假设我有@StartDate = 2016/04/01 和@EndDate = 2016/09/01,我检查@StartDate 是在四月的第一个星期五,然后@EndDate 将为每个月的第一个星期五创建日期:
2016/05/06
2016/06/03
2016/07/01
2016/08/05
如果@StartDate = 2016/04/12 和@EndDate = 2016/09/01,我注意到@StartDate 是四月的第二个星期二,然后每个月的第二个星期二去:
2016/05/10
2016/06/14
2016/07/12
2016/08/09
如果@StartDate = 2016/04/28 和@EndDate = 2016/09/01,我注意到@StartDate 是在四月的最后一个星期四:
2016/05/26
2016/06/30
2016/07/28
2016/08/25
在最后一种情况下,我需要验证每个月的周数,因为仅存在 4 周或 5 周的月份,我想要最后一次出现。
我做了什么?我找到了一个代码,每个月第三周的每个星期一都给我,我采用了一点来获得@StartDate和@EndDate:
;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
【问题讨论】:
-
您的规则不明确。如何区分一个月的第四个星期一和最后一个星期一?
-
@GordonLinoff 你说的是代码吗?我需要调整它来做到这一点
-
您是否考虑过使用calendar table?从包含工作日和周数的所有日期的完整列表中,您将始终能够筛选出您需要的日期。
-
@destination-data 日历表是临时表吗?它对我有什么帮助?
-
您的表格可以包含一个字段,用于标识每个月的最后一周。这就是这些表真正发挥作用的地方。它们允许您标记和识别对您而言重要的内容。
标签: sql sql-server database