模拟NETWORKDAYS返回错误的工作日

问题描述 投票:1回答:1

我创建了一个基于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

我的代码不会存储在datediffBEGFIN和减去周末和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

我怎么能处理这些案件,以正确计算工作日?

sql sql-server-2008 datediff
1个回答
1
投票

您可以使用日历表用于此目的。此操作会很容易与它。

你甚至可以处理银行假日

Check Thisthis (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) 
© www.soinside.com 2019 - 2024. All rights reserved.