我需要为更新的列Invoice_Date_to_Scan_Start_Date_Cal计算工作日并排除周末。我习惯于遵循以下代码来获取结果:
While True:
#my views.py function
time.sleep(30).
但是,我注意到,某些计算字段(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
的结果。我不知道该代码中的错误在哪里。谁能帮我这个忙。
谢谢。
答案 0 :(得分:0)
如果您只想从数据范围中排除周末,则可以在下面的代码中尝试此操作-
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
答案 1 :(得分:0)
我在网上找到了可以解决我问题的函数。它的作用与Excel中的NETWORKDAYS相同。将其发布在这里,也许可以帮助遇到相同问题的其他人。
创建函数[dbo]。[NetWorkDays](
@StartDate日期时间
,@ EndDate日期时间
)返回int作为开始
声明
@result int
,@ StartDate2日期时间
,@ EndDate2日期时间
,@ DateSwap1日期时间
,@ DateSwap2日期时间
,@ ReturnNegative
设置@ DateSwap1 = @StartDate
设置@ Dateswap2 = @EndDate
SET @ReturnNegative = 0
如果@EndDate <@StartDate
开始
SET @ReturnNegative = 1
SET @StartDate = @ Dateswap2
SET @EndDate = @ DateSwap1
END
设置@ StartDate2 = dateadd(d,8-datepart(dw,@StartDate),@StartDate)
设置@ EndDate2 = dateadd(d,1-datepart(dw,@ EndDate),@EndDate)
set @result = datediff(d,@ StartDate2,@ EndDate2)* 5/7
datediff(d,@StartDate,@ StartDate2)-1
datediff(d,@ EndDate2,@EndDate)
当datepart(dw,@ StartDate)= 1然后1否则0结尾的情况
当datepart(dw,@ EndDate)= 7然后1其他0结束时的情况
如果@ReturnNegative = 1
开始
SET @result = @result * -1
END
返回@结果
结束
GO