Подсчет рабочих дней между датой начала и текущей датой - PullRequest
4 голосов
/ 03 апреля 2019

Я пытаюсь использовать предопределенное значение INT, дающее 1 или 0 как рабочий день, или не считать последовательность скользящих рабочих дней.Я перепробовал много разного кода и проверил здесь разные посты, но ни один не достаточно конкретен, чтобы работать с моим.

Предопределенное значение INT - "business_day_flag_int".Это происходит от преобразования вычислений, дающих мне "day_business_day_flag", который является битовым значением.В настоящее время суббота / воскресенье и праздничные дни в банке активируют 0 для "day_business_day_flag", а понедельник-пятница, если выходной - выходной, присваивает ему значение 1.

Как заставить это работать в таблице обновлений, которую я могу добавить востальная часть моего файла генерации таблицы?Если понадобится больше информации, дайте мне знать.

Я перепробовал множество изменений и изменений того, что у меня здесь.Если я удаляю значения даты, это дает мне значение int для всех строк в столбце примерно 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)

. Я хочу, чтобы столбец "roll_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 равными нулю, где не имеет day_busienss_day_flag = 1 и по-прежнему считать их, а не считать их.Как сделать так, чтобы день не добавлялся?

1 Ответ

4 голосов
/ 03 апреля 2019

Рассмотрим сумму оконной функции в ваших 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...