Имитация NETWORKDAYS возвращает неправильные рабочие дни - PullRequest
0 голосов
/ 06 февраля 2019

Я создал NETWORKDAYS-подобную функцию в SQL на основе этого решения , которое правильно возвращает рабочие дни, в то время как записи (BEG и END) в рабочие дни .

BEG        END         businessd
--------------------------------
01/01/2018 15/01/2018  10       

--(15 days total)-(1st jan)-(4 weekends) = 10 | correct result

Но в некоторых случаях, когда BEG или END «хранятся» в выходные дни, он учитывает дополнительные дни:

BEG        END         businessd
--------------------------------
01/01/2018 28/01/2018  20       

--(28 days total)-(1st jan)-(4 weekends) = 19 | incorrect result

Мой код выполняет datediff между BEG и FIN ивычитая выходные дни и выходные дни, хранящиеся в таблице holydays

    SELECT e.*, 
            DATEDIFF(DAY, cast(BEG as datetime), cast(FIN as datetime))+1 --sum end date day
              -(SELECT
               (DATEDIFF(WK, cast(BEG as datetime), cast(FIN as datetime)) )
              +(CASE WHEN DATENAME(dw, cast(BEG as datetime)) = 'Sunday' THEN 1 ELSE 0 END)
              +(CASE WHEN DATENAME(dw, cast(FIN as datetime)) = 'Saturday' THEN 1 ELSE 0 END)
            ) * 2
            -(SELECT COUNT(*) FROM holydays nl
             WHERE nl.FECHA BETWEEN cast(BEG as datetime) AND cast(FIN as datetime)
            ) AS businessd,

            convert(nvarchar(6),cast(BEG as datetime),112) as iddate --new id based on fin
    FROM e
    ORDER BY original_ini,BEG

Как я могу обработать эти случаи для правильного подсчета рабочих дней?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать таблицу календаря для этой цели.Эта операция будет очень простой с ней.

вы даже можете обрабатывать банковские праздники

Отметьте это и это (Таблица календаря)

select * from calendar where isWorkDay = 1  

даст вам рабочие дни, а затем вы можете сделать простое объединение, как

select * from t
where exists 
( select 1 from calendar where isWorkDay = 1 and calendar.dt betweenn t.beg and t.end) 
...