使用 CalendarTable SQL Server 2008 计算 NETWORKDAYS
Calculating NETWORKDAYS using a CalendarTable SQL Server 2008
之前我创建了一个 SELECT 来计算工作日 (Weekends/Holydays),这对每条记录的某些日期范围不起作用。我被建议使用日历 Table,它实际上可以满足我搁置的其他要求,但我不知道如何计算工作日的 INI
和 END
。
我已经尝试使用半左连接和连接(也建议)进行 SELECT,但它似乎根本无法计算。
这是日历Table:
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
我的table:
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
Sub-Select 日历 table 中介于 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
建议的解决方案:
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;
之前我创建了一个 SELECT 来计算工作日 (Weekends/Holydays),这对每条记录的某些日期范围不起作用。我被建议使用日历 Table,它实际上可以满足我搁置的其他要求,但我不知道如何计算工作日的 INI
和 END
。
我已经尝试使用半左连接和连接(也建议)进行 SELECT,但它似乎根本无法计算。
这是日历Table:
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
我的table:
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
Sub-Select 日历 table 中介于 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
建议的解决方案:
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;