Sql server 计算T-SQL中两个日期之间的工作日(扩展)
扩大这一问题: 我想在t-sql中计算两个日期之间的工作日,只是周末,而不是整个工作日(24小时),比如说每个工作日从上午9点到下午5:30 我如何使用例如CMS的方法做到这一点: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
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小时,这就是我需要的。