繁体   English   中英

计算几年的下一个工作日

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM