Sql server 计算T-SQL中两个日期之间的工作日(扩展)

Sql server 计算T-SQL中两个日期之间的工作日(扩展),sql-server,tsql,date,count,Sql Server,Tsql,Date,Count,扩大这一问题: 我想在t-sql中计算两个日期之间的工作日,只是周末,而不是整个工作日(24小时),比如说每个工作日从上午9点到下午5:30 我如何使用例如CMS的方法做到这一点: DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME SET @StartDate = '2008/10/01' SET @EndDate = '2008/10/31' SELECT (DATEDIFF(dd, @StartDate, @EndDate

扩大这一问题:

我想在t-sql中计算两个日期之间的工作日,只是周末,而不是整个工作日(24小时),比如说每个工作日从上午9点到下午5:30

我如何使用例如CMS的方法做到这一点:

 DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2008/10/01'
SET @EndDate = '2008/10/31'


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)

我想你已经很好地掌握了,只需要把THEN 1改成THEN-1

然而,我不完全确定你想对你问题的时间部分做什么

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2013/03/01'
SET @EndDate = '2013/03/31'


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN -1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN -1 ELSE 0 END)
找到了这个

 CREATE FUNCTION dbo.GetWorkingDays
  ( @StartDate datetime,
    @EndDate datetime )
RETURNS INT
AS
BEGIN
  DECLARE @WorkDays int, @FirstPart int
  DECLARE @FirstNum int, @TotalDays int
  DECLARE @LastNum int, @LastPart int
  IF (DATEDIFF(day, @StartDate, @EndDate) < 2)
    BEGIN
      RETURN ( 0 )
    END
  SELECT
   @TotalDays = DATEDIFF(day, @StartDate, @EndDate) - 1,
   @FirstPart = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 6
                 WHEN 'Monday' THEN 5
                 WHEN 'Tuesday' THEN 4
                 WHEN 'Wednesday' THEN 3
                 WHEN 'Thursday' THEN 2
                 WHEN 'Friday' THEN 1
                 WHEN 'Saturday' THEN 0
               END,
   @FirstNum = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 5
                 WHEN 'Monday' THEN 4
                 WHEN 'Tuesday' THEN 3
                 WHEN 'Wednesday' THEN 2
                 WHEN 'Thursday' THEN 1
                 WHEN 'Friday' THEN 0
                 WHEN 'Saturday' THEN 0
               END
  IF (@TotalDays < @FirstPart)
     BEGIN
       SELECT @WorkDays = @TotalDays
     END
  ELSE
     BEGIN
       SELECT @WorkDays = (@TotalDays - @FirstPart) / 7
       SELECT @LastPart = (@TotalDays - @FirstPart) % 7
       SELECT @LastNum = CASE
         WHEN (@LastPart < 7) AND (@LastPart > 0) THEN @LastPart - 1
         ELSE 0
       END
       SELECT @WorkDays = @WorkDays * 5 + @FirstNum + @LastNum
     END
  RETURN ( @WorkDays )
END
GO
创建函数dbo.GetWorkingDays
(@StartDate datetime,
@结束日期(日期时间)
返回整数
作为
开始
声明@WorkDays int、@FirstPart int
声明@FirstNum int、@TotalDays int
声明@LastNum int、@LastPart int
IF(DATEDIFF(day,@StartDate,@EndDate)<2)
开始
返回(0)
结束
挑选
@TotalDays=DATEDIFF(天、@StartDate、@EndDate)-1,
@第一部分=案例日期名称(工作日@StartDate)
“星期天”是什么时候
“星期一”是什么时候
“星期二”是什么时候
“星期三”是什么时候
“星期四”是什么时候
“星期五”是什么时候
“星期六”是什么时候
完,,
@FirstNum=案例日期名称(工作日@StartDate)
“星期天”是什么时候
“星期一”是什么时候
“星期二”是什么时候
“星期三”是什么时候
“星期四”是什么时候
“星期五”是什么时候
“星期六”是什么时候
结束
如果(@TotalDays<@FirstPart)
开始
选择@WorkDays=@TotalDays
结束
其他的
开始
选择@WorkDays=(@TotalDays-@FirstPart)/7
选择@LastPart=(@TotalDays-@FirstPart)%7
选择@LastNum=CASE
当(@LastPart<7)和(@LastPart>0)时,则@LastPart-1
其他0
结束
选择@WorkDays=@WorkDays*5+@FirstNum+@LastNum
结束
返回时间(@工作日)
结束
去

这是我一直在寻找的,下面是代码,以防其他人需要它:

参数包括:

@D1 (StartDate)
@D2 (EndDate)
@T1 (Business Hours - Start)
@T2 (Business Hours - End)
该函数返回一个带有小时数的浮点值


创建函数[dbo].[WorkHoursDiff](@D1作为datetime,@D2作为datetime,@T1作为int,@T2作为int)
返回浮点数作为
开始
如果@D1>@D2返回0
将@whd声明为浮动
将@H1声明为float
将@H2声明为float
如果不是(日期部分(yyyy,@D1)=日期部分(yyyy,@D2)和日期部分(mm,@D1)=日期部分(mm,@D2)和日期部分(dd,@D1)=日期部分(dd,@D2))
开始
将@DD声明为datetime
设置为@whd=0
如果日期部分(dw,@D1)1和日期部分(dw,@D1)7
如果dbo.GetDateHour(@D1)@T2 SET@whd=0
否则,如果dbo.GetDateHour(@D1)>=@T1和dbo.GetDateHour(@D1)=@T1和dbo.GetDateHour(@D2)试试这个

Declare @startdate datetime,
@enddate datetime,
@countSunday int,
@countTuesday int,
@countWednesday int,@countThursday int,@countFriday int,@countSaturday int

set @countSunday=0
set @countMonday=0
set @countTuesday =0
set @countWednesday =0
set @countThursday =0
set @countFriday =0
set @countSaturday=0
set @startdate='2018-10-01'
set @enddate='2018-10-20'

while @startdate<=@enddate
Begin
    IF DatePart(WEEKDAY,@startdate) = 1
    SET @countSunday=@countSunday+1
    else if  DatePart(WEEKDAY,@startdate) = 2
      SET @countMonday=@countMonday+1  
      else if  DatePart(WEEKDAY,@startdate) = 3
      SET @countTuesday=@countTuesday+1  
      else if  DatePart(WEEKDAY,@startdate) = 4
      SET @countWednesday=@countWednesday+1  
      else if  DatePart(WEEKDAY,@startdate) = 5
      SET @countThursday=@countThursday+1  
      else if  DatePart(WEEKDAY,@startdate) = 6
      SET @countFriday=@countFriday+1  
      else if  DatePart(WEEKDAY,@startdate) = 7
      SET @countSaturday=@countSaturday+1  
    SET @startdate=DateAdd(d,1,@startdate)
END


select @countSunday as Sunday ,@countMonday as Monday,@countTuesday as Tuesday,@countWednesday as Wednesday,@countThursday as Thursday,@countFriday as Friday,@countSaturday as Saturday
DECLARE @DateFrom DateTime ='20181001' , @DateTo DateTime = '20181031'  ;
WITH CTE(dt)
AS
(
SELECT @DateFrom
UNION ALL
SELECT DATEADD(d, 1, dt) FROM CTE
  WHERE dt < @DateTo
)
SELECT datename("dw", dt) as Days,count(datename("dw", dt)) as numberofDays FROM CTE 
group by datename ("dw", dt)
Declare@startdate datetime,
@enddate日期时间,
@countSunday int,
@星期二国际,
@计数星期三整数、@计数星期四整数、@计数星期五整数、@计数星期六整数
设置为@countSunday=0
设置@countMonday=0
设置为@countbeday=0
设置为@count星期三=0
设置为@count星期四=0
设置为@countFriday=0
设置为@countSaturday=0
设置为@startdate='2018-10-01'
设置为@enddate='2018-10-20'
而@startdate试试这个

Declare @startdate datetime,
@enddate datetime,
@countSunday int,
@countTuesday int,
@countWednesday int,@countThursday int,@countFriday int,@countSaturday int

set @countSunday=0
set @countMonday=0
set @countTuesday =0
set @countWednesday =0
set @countThursday =0
set @countFriday =0
set @countSaturday=0
set @startdate='2018-10-01'
set @enddate='2018-10-20'

while @startdate<=@enddate
Begin
    IF DatePart(WEEKDAY,@startdate) = 1
    SET @countSunday=@countSunday+1
    else if  DatePart(WEEKDAY,@startdate) = 2
      SET @countMonday=@countMonday+1  
      else if  DatePart(WEEKDAY,@startdate) = 3
      SET @countTuesday=@countTuesday+1  
      else if  DatePart(WEEKDAY,@startdate) = 4
      SET @countWednesday=@countWednesday+1  
      else if  DatePart(WEEKDAY,@startdate) = 5
      SET @countThursday=@countThursday+1  
      else if  DatePart(WEEKDAY,@startdate) = 6
      SET @countFriday=@countFriday+1  
      else if  DatePart(WEEKDAY,@startdate) = 7
      SET @countSaturday=@countSaturday+1  
    SET @startdate=DateAdd(d,1,@startdate)
END


select @countSunday as Sunday ,@countMonday as Monday,@countTuesday as Tuesday,@countWednesday as Wednesday,@countThursday as Thursday,@countFriday as Friday,@countSaturday as Saturday
DECLARE @DateFrom DateTime ='20181001' , @DateTo DateTime = '20181031'  ;
WITH CTE(dt)
AS
(
SELECT @DateFrom
UNION ALL
SELECT DATEADD(d, 1, dt) FROM CTE
  WHERE dt < @DateTo
)
SELECT datename("dw", dt) as Days,count(datename("dw", dt)) as numberofDays FROM CTE 
group by datename ("dw", dt)
声明@DateFrom DateTime='20181001',@DateTo DateTime='20181031';
带热膨胀系数(dt)
作为
(
选择@DateFrom
联合所有
从CTE中选择日期添加(d,1,dt)
其中dt<@DateTo
)
选择datename(“dw”,dt)作为天数,从CTE中计算(datename(“dw”,dt))作为天数
按日期名称分组(“dw”,dt)

工时部分是工作日的营业时间。在这种情况下,我必须将datediff改为小时而不是天。假设我想知道星期一和星期二两个日期之间的工作时间,使用上述解决方案,我将有48小时(2天),但如果只有工作时间(上午9点到下午5点),将是16小时,这就是我需要的。