使用SQL Server获取DATEDIFF不包括周末

问题描述 投票:25回答:8

我使用这个查询来获取所用的时间。

SELECT DATEDIFF(dd, ActualStartDate, ActualCompletionDate) AS TimeTaken
FROM TableName

现在我想不包括周末和仅包括周一至周五的天数。

sql-server-2005
8个回答
54
投票

下面的示例查询,下面是我如何解决它的一些细节。

使用DATEDIFF(WK, ...)会给我们周2个日期之间的数字。 SQL Server将评估这是周数而不是基于天数之间的差异。这是完美的,因为我们可以用它来确定有多少周末的日期之间传递。

因此,我们可以通过多种2该值获得的周末两天发生的数量并减去从DATEDIFF(dd, ...)得到的工作日数。

这不正确的行为100%时开始或结束日期适逢周日,虽然。因此,我在一些情况下,逻辑加在计算结束时处理的那些实例。

您可能还需要考虑DATEDIFF是否不应该是充分的包容性。例如是9/10和9/11 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

5
投票

我发现,当我用这个有一个问题,当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

1
投票
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服务器2014年


1
投票

如果你恨CASE语句,就像我做的,希望能够使用该解决方案内嵌在查询中,刚刚获得天的差异和减去周末天计,你就会有理想的结果:

declare @d1 datetime, @d2 datetime,  @days int
select @d1 = '2018/10/01',  @d2 = '2018/11/01'

SET @days = DateDiff(dd, @d1, @d2) - DateDiff(ww, @d1, @d2)*2
print @days

(唯一的条件 - 或至少一点要记住 - 就是这种计算是不包括的最后日期,所以你可能需要添加一天的结束日期,以实现一个包容性的结果)


0
投票
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

0
投票

我想和大家分享我创建了一个可以帮助你的代码。

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

如果你有一个假期表,你也可以使用,使您不必IF代码段列出所有的假期在ELSE。您还可以创建为编码功能,使用该功能时,你需要在你的查询。

我希望这可以帮助了。


0
投票

使用https://stackoverflow.com/a/1804095和JeffFisher30的回答以上(https://stackoverflow.com/a/14572370/6147425)和我自己的需要有小数天,我写了这个:

DateDiff(second,Start_Time,End_Time)/86400.0
            -2*DateDiff(week, Start_Time, End_Time)
            -Case When (DatePart(weekday, Start_Time)+@@DateFirst)%7 = 1 Then 1 Else 0 End
            +Case When (DatePart(weekday, End_Time)+@@DateFirst)%7 = 1 Then 1 Else 0 End

-1
投票

/ *实施例:/ MONDAY / SET DATEFIRST 1 SELECT dbo.FUNC_GETDATEDIFFERENCE_WO_WEEKEND( '2019年2月1日', '2019年2月12日')* / CREATE FUNCTION FUNC_GETDATEDIFFERENCE_WO_WEEKEND(@pdtmaLastLoanPayDate DATETIME,@pdtmaDisbursedDate DATETIME)RETURNS BIGINT BEGIN

DECLARE
@mintDaysDifference     BIGINT

SET @mintDaysDifference = 0

WHILE CONVERT(NCHAR(10),@pdtmaLastLoanPayDate,121) <= CONVERT(NCHAR(10),@pdtmaDisbursedDate,121)
BEGIN
    IF DATEPART(WEEKDAY,@pdtmaLastLoanPayDate) NOT IN (6,7)
    BEGIN
        SET @mintDaysDifference = @mintDaysDifference + 1
    END

    SET @pdtmaLastLoanPayDate = DATEADD(DAY,1,@pdtmaLastLoanPayDate)
END

RETURN ISNULL(@mintDaysDifference,0)

结束

© www.soinside.com 2019 - 2024. All rights reserved.