我想知道如何计算SQL Server中两个时间戳(例如2016-02-24 17:30:00和另一个时间戳)之间的“小时数” - 但不包括周六和周日的整个48小时时段,如果越过。
这与纯粹的营业时间并不完全相同,但有点像。原因很冗长且没必要。
编辑:我也可以说结束日期总是在一周内。所以真的...“开始日期”可以简单地转换到星期一午夜,如果在星期六/星期日...那么可能一个功能包括总周数......
答案 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以获得小时数。