模拟 NETWORKDAYS returns 个错误的工作日
Simulating NETWORKDAYS returns wrong business days
我基于 在 sql 上创建了一个类似 NETWORKDAYS 的函数,在记录(BEG 和 END) 开启时 returns 正确的工作日工作日.
BEG END businessd
--------------------------------
01/01/2018 15/01/2018 10
--(15 days total)-(1st jan)-(4 weekends) = 10 | correct result
但在某些情况下,如果 BEG 或 END 在周末 "stored",则计算额外的天数:
BEG END businessd
--------------------------------
01/01/2018 28/01/2018 20
--(28 days total)-(1st jan)-(4 weekends) = 19 | incorrect result
我的代码在 BEG
和 FIN
之间执行 datediff
并减去存储在 holydays
table[=19= 中的周末和节日]
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
我如何处理这些情况才能正确计算工作日?
您可以为此使用日历 table。有了它这个操作会很轻松
您甚至可以应对银行假日
Check This and 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)
我基于
BEG END businessd
--------------------------------
01/01/2018 15/01/2018 10
--(15 days total)-(1st jan)-(4 weekends) = 10 | correct result
但在某些情况下,如果 BEG 或 END 在周末 "stored",则计算额外的天数:
BEG END businessd
--------------------------------
01/01/2018 28/01/2018 20
--(28 days total)-(1st jan)-(4 weekends) = 19 | incorrect result
我的代码在 BEG
和 FIN
之间执行 datediff
并减去存储在 holydays
table[=19= 中的周末和节日]
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
我如何处理这些情况才能正确计算工作日?
您可以为此使用日历 table。有了它这个操作会很轻松
您甚至可以应对银行假日
Check This and 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)