簡體   English   中英

明年的第N個工作日

[英]Nth Business Day of next year

我有一個表名稱為Table_A,其中包含工作日列和日期列。

BD  |   Date
----|--------
3   | Aug-03-2017
15  | Aug-21-2017
7   | Sep-11-2017
20  | Oct-20-2017
14  | Nov-20-2017

我想要的是,根據其相應的BD,明年日期與同一日期的月份相同

所需輸出:

BD  |   Date       | Nxt_yr_Date
----|--------------|------------
3   | Aug-03-2017  | Aug-03-2018
15  | Aug-21-2017  | Aug-21-2018
7   | Sep-11-2017  | Sep-11-2018
20  | Oct-20-2017  | Oct-22-2018
14  | Nov-20-2017  | Nov-20-2018
18  | Dec-27-2017  | Dec-26-2018

現在,我已經編寫了一個代碼,將“日期”轉換為明年的日期,然后檢查是否是星期六,然后加上2天,如果是星期天,然后加上1天

我到目前為止的代碼:

select
case 
when datepart(dw,dateadd(year,1,(dateadd(day,1,[Date])))) = 1 
    then dateadd(year,1,(dateadd(day,2,[Date])))
when datepart(dw,dateadd(year,1,(dateadd(day,1,[Date])))) = 7 
    then dateadd(year,1,(dateadd(day,3,[Date])))
    else dateadd(year,1,[Date])
end as Nxt_yr_Date
from Table_A

但無法實現BD專用。 提前致謝。

如果我對您的理解正確,則希望找到:

  • 2018年8月的第三個工作日
  • 2018年8月的第15個工作日
  • 2018年9月的第7個工作日
  • 等等

這是一種實現方法:

SET DATEFIRST 7

;WITH
    Calendar(Date) AS
    (
        SELECT      CONVERT(date, '2018-01-01')
        UNION ALL
        SELECT      DATEADD(DAY, 1, Date)
        FROM        Calendar
        WHERE       Date < '2018-12-31'
    ),
    BusinessCalendar(Date, BD) AS
    (
        SELECT      Date
                ,   ROW_NUMBER() OVER (PARTITION BY MONTH(Date) ORDER BY Date)
        FROM        Calendar
        WHERE       DATEPART(WEEKDAY, Date) NOT IN (1, 7)
    )

SELECT          A.BD
        ,       A.Date
        ,       CAL.Date                    AS NextYearDate
FROM            #TableA             A
INNER JOIN      BusinessCalendar    CAL     ON MONTH(A.Date) = MONTH(CAL.Date)
                                           AND A.BD          = CAL.BD
OPTION (MAXRECURSION 0)

它使用2個CTE來處理工作:

  • Calendar是遞歸CTE,包含2018年的每一天
  • BusinessCalendar過濾日歷以僅保留星期一至星期五,然后對每個月中的那些天進行編號

剩下的就是加入到您的Table_A

(請注意,這沒有考慮到任何公共假期,只是工作日和周末)

這是您想要的嗎?

select bid,
       max(case when year(date) = 2017 then date end) as date_2017,
       max(case when year(date) = 2018 then date end) as date_2018
from table_A
group by bid;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM