我创建了一个基于this solution至极返回正确的工作日,而记录(BEG和END)都在工作日的SQL一个NETWORKDAYS类似功能。
BEG END businessd
--------------------------------
01/01/2018 15/01/2018 10
--(15 days total)-(1st jan)-(4 weekends) = 10 | correct result
但是,在某些情况下,BEG和终点“存储”在周末它计算额外的天:
BEG END businessd
--------------------------------
01/01/2018 28/01/2018 20
--(28 days total)-(1st jan)-(4 weekends) = 19 | incorrect result
我的代码不会存储在datediff
表BEG
和FIN
和减去周末和holydays之间的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
我怎么能处理这些案件,以正确计算工作日?
您可以使用日历表用于此目的。此操作会很容易与它。
你甚至可以处理银行假日
Check This和this (Calendar Table)
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)