得到DATEDIFF不包括周末使用SQL Server
我正在使用此查询来获取时间。
SELECT DATEDIFF(dd, ActualStartDate, ActualCompletionDate) AS TimeTaken FROM TableName
现在我想排除周末,只包括周一至周五的天数。
下面的示例查询,这里是我如何解决它的一些细节。
使用DATEDIFF(WK, ...)
会给我们两个date之间的星期数。 SQL Server将此评估为周数之间的差异,而不是基于天数。 这是完美的,因为我们可以使用它来确定date之间通过的周末数。
因此,我们可以通过将这个值乘以2来得到发生的周末天数,并从DATEDIFF(dd, ...)
减去周末天数以得到周日的数量。
尽pipe如此,当周日的开始或结束date不正确时,这并不是100%正确。 所以我在计算结束时添加了一些逻辑来处理这些实例。
你也可以考虑DATEDIFF
是否应该完全包容。 例如9天和9天之间的差别是1天还是2天? 如果是后者,则需要将1添加到最终产品中。
declare @d1 datetime, @d2 datetime select @d1 = '9/9/2011', @d2 = '9/18/2011' select datediff(dd, @d1, @d2) - (datediff(wk, @d1, @d2) * 2) - case when datepart(dw, @d1) = 1 then 1 else 0 end + case when datepart(dw, @d2) = 1 then 1 else 0 end
我发现当我使用这个时,星期六d1倒下时出现了问题。 以下是我用来纠正这一点。
declare @d1 datetime, @d2 datetime select @d1 = '11/19/2011' , @d2 = '11/28/2011' select datediff(dd, @d1, @d2) +case when datepart(dw, @d1) = 7 then 1 else 0 end - (datediff(wk, @d1, @d2) * 2) - case when datepart(dw, @d1) = 1 then 1 else 0 end + case when datepart(dw, @d2) = 1 then 1 else 0 end
BEGIN DECLARE @totaldays INT; DECLARE @weekenddays INT; SET @totaldays = DATEDIFF(DAY, @startDate, @endDate) SET @weekenddays = ((DATEDIFF(WEEK, @startDate, @endDate) * 2) + -- get the number of weekend days in between CASE WHEN DATEPART(WEEKDAY, @startDate) = 1 THEN 1 ELSE 0 END + -- if selection was Sunday, won't add to weekends CASE WHEN DATEPART(WEEKDAY, @endDate) = 6 THEN 1 ELSE 0 END) -- if selection was Saturday, won't add to weekends Return (@totaldays - @weekenddays)
结束
这是在SQL Server 2014上
declare @d1 datetime, @d2 datetime select @d1 = '4/19/2017', @d2 = '5/7/2017' DECLARE @Counter int = datediff(DAY,@d1 ,@d2 ) DECLARE @C int = 0 DECLARE @SUM int = 0 WHILE @Counter > 0 begin SET @SUM = @SUM + IIF(DATENAME(dw, DATEADD(day,@c,@d1))IN('Sunday','Monday','Tuesday','Wednesday','Thursday') ,1,0) SET @Counter = @Counter - 1 set @c = @c +1 end select @Sum
我只想分享我创build的代码可能会帮助你。
DECLARE @MyCounter int = 0, @TempDate datetime, @EndDate datetime; SET @TempDate = DATEADD(d,1,'2017-5-27') SET @EndDate = '2017-6-3' WHILE @TempDate <= @EndDate BEGIN IF DATENAME(DW,@TempDate) = 'Sunday' OR DATENAME(DW,@TempDate) = 'Saturday' SET @MyCounter = @MyCounter ELSE IF @TempDate not in ('2017-1-1', '2017-1-16', '2017-2-20', '2017-5-29', '2017-7-4', '2017-9-4', '2017-10-9', '2017-11-11', '2017-12-25') SET @MyCounter = @MyCounter + 1 SET @TempDate = DATEADD(d,1,@TempDate) CONTINUE END PRINT @MyCounter PRINT @TempDate
如果您有假期表,也可以使用该表,这样就不必在代码的ELSE IF部分列出所有假期。 您也可以为此代码创build一个函数,并在查询中需要时使用该函数。
我希望这也可以帮助。