计算给定日期的期间

时间:2017-12-21 14:06:42

标签: sql sql-server tsql

鉴于参考日期,我想计算下一个工作日,下周末,下周工作日以及截至月底的天数

例如21-12-2017我想要

next business day -> 22-12-2017 / 22-12-2017
next weekend -> 23-12-2017 / 24-12-2017
next week business days->25-12-2017 / 29-12-2017
days until end of month ->22-12-2017 / 31-12-2017

我应该怎么做?我已经有了一个日历表,但我不知道如何在不使用每列的子选择的情况下完成这些操作

日历表看起来像这样

Date       DayOfWeek MonthStartDate MonthEndDate MonthLength IsWeekend
2017-12-21 4         2017-12-01     2017-12-31   31          0

2 个答案:

答案 0 :(得分:0)

关于如何使用日历表的示例

select  top 1 next_business_day = [Date]
from    calendar
where   [Date]  > '2017-12-21'
order by [Date]

select  top 2 next_weekend = [Date]
from    calendar
where   [Date]      > '2017-12-21'
and     IsWeekend   = 1
order by [Date]

对于next week business days,如果您可以在日历表中添加week no,则会更容易

答案 1 :(得分:0)

这使用了我的日历表,因为我在你发布一些你之前开始工作(加上我需要测试一些东西)。

我注意到的一件事是,你说下周工作日"但是,20171225 - 20171229是正确的吗?第25天是圣诞节(不是很多地方认为那天是工作日)。

任何方式,您都需要为您的日历表进行编辑,但请告诉我这是否有效:

DECLARE @Date Date = '20171221'

SELECT TOP 1
       FIRST_VALUE([date]) OVER (ORDER BY DD.[Working Day] DESC, DD.Date) AS NextWorkingDay,
       FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Saturday' THEN 0 ELSE 1 END ASC, DD.Date) AS WeekendStart,
       DATEADD(DAY, 1,FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Saturday' THEN 0 ELSE 1 END ASC, DD.Date)) AS WeekendEnd,
       FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Monday' THEN 0 ELSE 1 END ASC, DD.Date) AS NextWeekStart,
       DATEADD(DAY, 4,FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Monday' THEN 0 ELSE 1 END ASC, DD.Date)) AS NextWeekEnd,
       DATEADD(Day, 1, @Date) AS EndStart,
       DATEADD(DAY, -1, (DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date)+1, 0))) AS MonthEnd
FROM DimDate DD
WHERE DD.Date > @Date;

我注意到您的日历表中没有日期名称。我建议添加这个。否则,您需要将我对[Day Name]的引用更改为DATENAME(WEEKDAY,[Date]),但这会降低性能。