计算开始日期和当前日期之间的营业日

问题描述 投票:4回答:1

我正在尝试使用预定义的INT值,将1或0作为工作日或不计算滚动工作日序列。我尝试了很多不同的代码,并在这里检查了不同的帖子,但没有一个具体到足以与我合作。

预定义的INT值是“business_day_flag_int”。这来自转换计算,给我“day_business_day_flag”这是一个有点值。目前星期六/星期日和银行假日触发0为“day_business_day_flag”,而周一至周五为非假日给它1值。

如何在Update表中将其设置为可以添加到表生成文件的其余部分?如果需要更多信息,请告诉我。

我尝试过一系列不同的改动和变化。如果我删除日期值,它会为大约12600个工作日的列中的所有行提供一个int值。如果我使用它给我的日期范围

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

这给了我计算天数并将rolling_business_day_sequence行值设置为null,其中没有day_busienss_day_flag = 1且仍在计算它们而不是不计算它们。我怎么能让它不添加一天?

sql sql-server tsql
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.