计算使用CalendarTable SQL Server 2008中NETWORKDAYS

问题描述 投票:0回答:2

以前我创建了一个SELECT来计算工作日(周末/ Holydays)至极的特定日期范围内为每个记录没有工作。我建议使用日历表,至极的其他要求我必须保持实际上的工作,但我想不出如何计算INIEND为工作日。

我试图做一个选择具有半左连接和连接(建议藏汉),但它似乎并没有在所有的计算。

这是日历表:

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)

我希望得到正确的工作日calculatios包括节假日所以上面的例子中,我会得到这样的:

INI                            FIN                            DD     ND
------------------------------ ------------------------------ ----- -----
20180129                       20180211                       14     10
sql sql-server sql-server-2008 datediff
2个回答
1
投票

子选择在日历表是INIFIN之间,并且工作日的行数。

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 

1
投票

建议解决办法:

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;
© www.soinside.com 2019 - 2024. All rights reserved.