计算工作日(不包括周末)

时间:2019-08-01 07:48:17

标签: sql sql-server

我需要为更新的列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_CalDoc_Date = 2019-05-02 因此,Scan_Start_Date_Calc = 2018-11-19结果应为Invoice_Date_to_Scan_Start_Date_Cal。但是使用上面的代码,我得到了-119的结果。我不知道该代码中的错误在哪里。谁能帮我这个忙。

谢谢。

2 个答案:

答案 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