Расчет NETWORKDAYS с использованием CalendarTable SQL Server 2008 - PullRequest
0 голосов
/ 11 февраля 2019

Ранее я создал SELECT для расчета рабочих дней (выходных / праздничных дней), которые не работают для определенных диапазонов дат для каждой записи.Мне предложили использовать таблицу календаря, которая фактически работала для других требований, которые у меня были в ожидании, но я не могу понять, как рассчитать INI и END для рабочих дней.

Я пыталсясделайте SELECT с полу-левым соединением и объединением (предлагается также), но, похоже, он вообще не рассчитывается.

Это таблица календаря:

CalendarId  DateValue               DayNumberOfWeek NameOfDay  NameOfMonth WeekOfYear  JulianDay   USAIsBankHoliday USADayName
----------- ----------------------- --------------- ---------- ----------- ----------- ----------- ---------------- -------------------
20100101    2010-01-01 00:00:00.000 5               Viernes    Enero       1           1           1                Año nuevo

Моя таблица:

INI                            FIN                            DD --DATEDIFF BETWEEN DATES
------------------------------ ------------------------------ -----------
20180129                       20180211                       14

Моя попытка вычислить рабочие дни

SELECT CONVERT(NVARCHAR,INI,112) AS INI, 
    CONVERT(NVARCHAR,FIN,112) AS FIN, 
    DATEDIFF(DD, INI, FIN)+1 AS DD 
FROM HISTORICOLICMED T
WHERE EXISTS(
    SELECT 1 FROM CALENDAR C
    WHERE T.INI = C.CALENDARID and T.FIN = C.CALENDARID
    AND C.USAISBANKHOLIDAY = 0 BETWEEN T.INI AND T.FIN)

Я ожидаю получить правильные расчеты рабочего дня, включая выходные дни, поэтому в приведенном выше примере я получу что-то вроде:

INI                            FIN                            DD     ND
------------------------------ ------------------------------ ----- -----
20180129                       20180211                       14     10

Ответы [ 2 ]

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

Предлагаемое решение:

set datefirst 1;
select INI
    ,FIN
    , DATEDIFF(DD, INI, FIN)+1 as DD
    ,(DATEDIFF(DD, INI, FIN)+1)
    -(DATEDIFF(WK, INI, FIN)*2)
    -(case DATEPART(DW, INI)    when 7 then 1 else 0 end)
    -(case DATEPART(DW, FIN)    when 6 then 1 else 0 end)
    -(select COUNT(*) from CALENDAR
        where DateValue between INI and FIN
        and USAIsBankHoliday = 1)
    as ND -- Working days except US Bank holidays
from HISTORICOLICMED;
0 голосов
/ 11 февраля 2019

Sub-Выберите количество строк в таблице календаря, которые находятся между INI и FIN и являются рабочими днями.

SELECT CONVERT(NVARCHAR,INI,112) AS INI, 
    CONVERT(NVARCHAR,FIN,112) AS FIN, 
    DATEDIFF(DD, INI, FIN)+1 AS DD, 
    (SELECT COUNT(*) FROM CalendarTable WHERE ...) AS ND
FROM HISTORICOLICMED 
...