SQL 服务器 - Datediff,小时,但不包括周六/周日

SQL Sever - Datediff, hours, but exclude Saturday/ Sundays

我想知道如何计算 SQL 服务器中两个时间戳(例如 2016-02-24 17:30:00 和另一个时间戳)之间的 "number of hours" - 但不包括星期六和周日的完整 48 小时时段,如果超过的话。

这与纯营业时间不太一样,但有点像。理由是啰嗦,没必要

编辑:我也可以说结束日期总是在一周内。所以真的...... "start date" 可以简单地转化为星期一午夜,如果在星期六/星期日......那么也许一个函数包括总周计数......

DATEDIFF(Week, date, date2) 将 return 两个日期之间跨越的周界数。对于 SQL 服务器,这意味着日期之间有多少个星期日(而不是它们之间有 7 天的天数)。这意味着,如果您确实可以假设开始和结束日期不会是星期六或星期日,您可以从正常的 DATEDIFF 调用中减去 48 X DATEDIFF(Week, date, date2),这应该会给您之后的结果。

我会使用日历 table(例如 dbo.DateDimension,参考 https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/):

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,
  ...
)

还有以下查询:

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

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

我会使用下面的代码

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