对于更新后的列Invoice_Date_to_Scan_Start_Date_Cal,我需要计算工作日并排除周末。我习惯于使用下面的代码来获得结果:
UPDATE FBL1IN_working
SET FBL1IN_working.Invoice_Date_to_Scan_Start_Date_Cal
= (datediff (DD, Doc_Date, Scan_Start_Date_Calc) +1)
-(datediff (wk, Doc_Date, Scan_Start_Date_Calc) *2)
-(case when datename(dw, Doc_Date ) = 'Sunday' then 1 else 0 end)
-(case when datename(dw, Scan_Start_Date_Calc) = 'Saturday' then 1 else 0 end) 然而,我注意到,在一些计算字段(Invoice_Date_to_Scan_Start_Date_Cal)中存在一到两天的差异。例如:
Doc_Date = 2019-05-02和Scan_Start_Date_Calc = 2018-11-19因此,Invoice_Date_to_Scan_Start_Date_Cal结果应该是-119。但是使用上面的代码,我得到了-117的结果。我不知道代码中的错误在哪里。有没有人能帮我这个忙。
谢谢。
发布于 2019-08-01 16:28:06
如果您只想从数据范围中查找排除周末,您可以尝试下面的代码:
DECLARE @D1 DATETIME = '20190601'
DECLARE @D2 DATETIME = '20190611'
DECLARE @LoopCount INT = (SELECT DATEDIFF(DD,@D1,@D2))
DECLARE @TempTable TABLE
(
date date
)
WHILE @LoopCount >= 0
BEGIN
-- Checking not in (1,7) will exclude Suturday and Sunday from the counting
IF DATEPART(dw,(DATEADD(DD,-@LoopCount,GETDATE()))) NOT IN (1,7)
BEGIN
INSERT INTO @TempTable (date)
VALUES (DATEADD(DD,-@LoopCount,GETDATE()))
END
SET @LoopCount = @LoopCount - 1
END
SELECT COUNT(*) total_working_days
FROM @TempTable发布于 2019-08-01 17:04:53
我在网上找到了一个函数,可以解决我的问题。它的作用与Excel中的NETWORKDAYS相同。在这里张贴它,也许它可以帮助其他有同样问题的人。
创建函数dbo.NetWorkDays(
@StartDate日期时间
,@EndDate datetime
)返回int作为begin
声明
@result int
,@StartDate2日期时间
,@EndDate2 datetime
,@DateSwap1 datetime
,@DateSwap2 datetime
,@ReturnNegative位
设置@DateSwap1 = @StartDate
设置@Dateswap2 = @EndDate
设置@ReturnNegative =0
如果@EndDate < @StartDate
开始
设置@ReturnNegative =1
设置@StartDate = @Dateswap2
设置@EndDate = @DateSwap1
结束
set @StartDate2 = dateadd(d,8-datepart(dw,@StartDate),@StartDate)
set @EndDate2 = dateadd(d,1-datepart(dw,@EndDate),@EndDate)
set @result = datediff(d,@StartDate2,@EndDate2) *5/7
<代码>F29
如果@ReturnNegative =1
开始
设置@result = @result * -1
结束
return @result
结束
去
https://stackoverflow.com/questions/57304182
复制相似问题