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
我想知道如何计算 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