计算开始日期和当前日期之间的工作日

时间:2019-04-03 15:19:45

标签: sql sql-server tsql

我尝试使用给定1或0的预定义INT值作为工作日,或者不计算滚动工作日序列。我尝试了很多不同的代码,并在此处签出了不同的文章,但没有一个具体的足以与我的一起工作。

预定义的INT值是“ business_day_flag_int”。这是通过转换计算得到的,给我“ day_business_day_flag”(有点值)。当前,周六/周日和银行假日为“ day_business_day_flag”触发0,而周一至周五为非假日则将其设为1。

如何使它在可以添加到表生成文件其余部分的更新表中工作?如果需要更多信息,请告诉我。

我已经尝试过对这里的内容进行一系列不同的更改和变化。如果删除日期值,它将为我提供大约12600个工作日列中所有行的整数值。如果我使用日期范围,它会给我

DECLARE @StartDate DATETIME = '01/01/2000' --Starting value of Date Range
DECLARE @EndDate DATETIME = '01/01/2050' --End Value of Date Range
DECLARE
    @DayOfWeekInMonth INT,
    @DayOfWeekInYear INT,
    @DayOfQuarter INT,
    @WeekOfMonth INT,
    @CurrentYear INT,
    @CurrentMonth INT,
    @CurrentQuarter INT
DECLARE @CurrentDate AS DATETIME = @startDate
    SET @CurrentMonth = DATEPART(MM, @CurrentDate)
    SET @CurrentYear = DATEPART(YY, @CurrentDate)
    SET @CurrentQuarter = DATEPART(QQ, @CurrentDate)


UPDATE [EDW_MDM].[dbo].[CALENDAR_DIM] SET 
    business_day_flag_int = Convert(INT, day_business_day_flag)
UPDATE [EDW_MDM].[dbo].[CALENDAR_DIM] SET 
    rolling_business_day_sequence = (SELECT count(business_day_flag_int) FROM [EDW_MDM].[dbo].[CALENDAR_DIM]
    WHERE business_day_flag_int = 1 and
    day_date between @StartDate and @CurrentDate)

我希望“ rolling_business_day_sequence”列按顺序计算过去的工作日。例如第1行= 1,第2行= 2,依此类推。直到日历结束。

更新1:将代码行编辑为

UPDATE [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] SET 
    rolling_business_day_sequence = datediff(day,@StartDate,day_date) WHERE day_business_day_flag = 1

这使我可以对天进行计数,并在没有day_busienss_day_flag = 1的情况下将rolling_business_day_sequence行值设置为null,并且仍对其进行计数而不是不对其进行计数。我如何使其不增加日期?

1 个答案:

答案 0 :(得分:4)

请考虑您的WHERE条件下的窗函数求和,以累计计算指定日期范围内的business_day_flag_int = 1的所有实例。但是,要在UPDATE中使用窗口函数,需要CTE或子查询。

WITH CTE AS
( 
    SELECT ID, SUM(CASE WHEN day_date BETWEEN @StartDate AND @CurrentDate 
                             AND business_day_flag_int = 1
                        THEN 1
                         ELSE 0
                   END) OVER (ORDER BY day_date) AS running_sequence
    FROM [EDW_MDM].[dbo].[CALENDAR_DIM]
) 

UPDATE t
FROM [EDW_MDM].[dbo].[CALENDAR_DIM] t
JOIN CTE ON t.ID = CTE.ID
SET t.rolling_business_day_sequence = CTE.running_sequence