SQL Sever - Datediff,小时,但不包括星期六/星期日

时间:2017-02-28 23:24:01

标签: sql-server datetime datediff business-logic

我想知道如何计算SQL Server中两个时间戳(例如2016-02-24 17:30:00和另一个时间戳)之间的“小时数” - 但不包括周六和周日的整个48小时时段,如果越过。

这与纯粹的营业时间并不完全相同,但有点像。原因很冗长且没必要。

编辑:我也可以说结束日期总是在一周内。所以真的...“开始日期”可以简单地转换到星期一午夜,如果在星期六/星期日...那么可能一个功能包括总周数......

3 个答案:

答案 0 :(得分:1)

DATEDIFF(Week, date, date2)将返回两个日期之间交叉的周边界数。对于SQL Server,这意味着日期之间有多少个星期日(而不是它们之间的7天时段的数量)。这意味着,如果您确实可以假设开始日期和结束日期不是星期六或星期日,则可以从正常的48 X DATEDIFF(Week, date, date2)电话中减去DATEDIFF,这应该会告诉您之后的情况。

答案 1 :(得分:1)

我会使用以下代码

declare @NumberOfHours int

declare @StartTime datetime
declare @EndTime datetime

set @StartTime = '2017-02-02 17:30:00.000'
set @EndTime = '2017-02-07 00:00:00.000'

set @NumberOfHours = DATEDIFF(HOUR,@StartTime,@EndTime)

if(datepart(WEEKDAY, @StartTime)=1)
begin
    set @NumberOfHours = @NumberOfHours     DATEDIFF(HH,@StartTime,@EndTime)%24
end
else if(datepart(WEEKDAY, @StartTime)=7)
begin
    set @NumberOfHours = @NumberOfHours - DATEDIFF(HH,@StartTime,@EndTime)%24
    set @NumberOfHours = @NumberOfHours - 24
end
else
begin
    set @NumberOfHours = @NumberOfHours -  datediff(ww,@StartTime,@EndTime)*48
end
print @NumberOfHours

答案 2 :(得分:0)

我会使用日历表(例如CREATE TABLE dbo.DateDimension ( DateKey INT NOT NULL PRIMARY KEY, [Date] DATE NOT NULL, [Day] TINYINT NOT NULL, DaySuffix CHAR(2) NOT NULL, [Weekday] TINYINT NOT NULL, WeekDayName VARCHAR(10) NOT NULL, IsWeekend BIT NOT NULL, IsHoliday BIT NOT NULL, ... ) ,参考http://unicode.org/cldr/utility/bidi.jsp):

SELECT SUM(
    CASE 
        WHEN dd.[Date] = CONVERT(DATE, @StartDate) THEN DATEDIFF(MINUTE, @StarDate, DATEADD(DAY, 1, dd.[Date]))
        WHEN dd.[Date] = CONVERT(DATE, @EndDate) THEN DATEDIFF(MINUTE, dd.[Date], @EndDate)
        ELSE 24 * 60 -- Full day
    END) / 60 AS SumOfHours
FROM dbo.DateDimension dd
WHERE dd.[Date] >= CONVERT(DATE, @StartDate) AND dd.[Date] <= CONVERT(DATE, @EndDate) 
AND dd.IsWeekend = 0

以及以下查询:

{{1}}

以上查询将计算所请求时间段的总分钟数,然后将除以60以获得小时数。