[英]Calculate next business day for several years
我必须生成一个包含所有非工作日及其下一个工作日的表格。
给定的是:一个表,存储某些城市的周末。
CREATE TABLE WeekHolidays
(
CitiesId int
,Cities_Name varchar(50)
,HolidayDate int
)
另一个举行公众假期的桌子:
CREATE TABLE Holidays
(
CitiesId int
,Cities_Name varchar(50)
,HolidayDate datetime
)
目前,我正在为接下来的2047周(近40年)生成周末,并添加以下公共假期:
SELECT Cities_Id
,Cities_Name
,DATEADD(WEEK,sptv.number,DATEADD(DAY,(((HolidayDate - 1) + 7) %7),DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0))) as HolidayDate
FROM WeekHolidays
CROSS JOIN master..spt_values sptv
WHERE sptv.type = 'P'
UNION
SELECT Cities_Id
,Cities_Name
,HolidayDate
FROM Holidays
但是,现在我需要为每个日期的下一个工作日添加logik:前滚至不在此表中的第一天(针对每个城市)。
复制Rextester: http ://rextester.com/OZTT34904
所以结果应该像这样:
CitiesId Cities_Name HolidayDate NextBusinessDay
3 PARIS 14.07.2017 17.07.2017
3 PARIS 15.07.2017 17.07.2017
3 PARIS 16.07.2017 17.07.2017
3 PARIS 22.07.2017 24.07.2017
3 PARIS 23.07.2017 24.07.2017
3 PARIS 29.07.2017 31.07.2017
3 PARIS 30.07.2017 31.07.2017
3 PARIS 05.08.2017 07.08.2017
3 PARIS 06.08.2017 07.08.2017
3 PARIS 12.08.2017 14.08.2017
3 PARIS 13.08.2017 14.08.2017
3 PARIS 15.08.2017 16.08.2017
3 PARIS 18.08.2017 21.08.2017
3 PARIS 19.08.2017 21.08.2017
3 PARIS 20.08.2017 21.08.2017
3 PARIS 26.08.2017 28.08.2017
3 PARIS 27.08.2017 28.08.2017
例如:HolidayDate = 14.07.2017,下一个工作日将是17.07.2017,即15.07。&16.07。 包含在HolidayDate列中(周六和周日是巴黎的假期)。
我希望它现在可以理解。
知道如何轻松,快速地解决这个问题吗?
提前致谢! 斯特凡
您可以尝试以下方法:
with getstarts as (
select mydays.*
-- transform the dates to have weekends day as 6 and 7
,case when DATEPART(weekday, Holiday) =1 then 7
else DATEPART(weekday, Holiday)-1 end as weekdays
FROM (
YOUR_TABLE
) mydays
)
SELECT g.*, DATEADD(day,8-g.weekdays,g.Holiday) as c
FROM getstarts AS g
where g.weekdays between 6 and 7
order by holiday
我将日期更改为星期一为一周的第一天。 然后我通过添加缺少的天数来计算日期
要创建一个包含日期的表,请看一下这个漂亮的内联表值函数https://stackoverflow.com/a/30133693/8302316
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.