我想知道如何計算SQL中兩個時間戳(例如2016-02-24 17:30:00和另一個時間戳)之間的「小時數」服務器 - 但不包括星期六和星期日的全部48小時期限,如果越過。SQL Sever - Datediff,小時,但不包括週六/週日
這與純粹的營業時間並不完全相同,但有點類似。其原因是囉嗦和不必要的。
編輯:我也可以說,結束日期將永遠在一週內。所以真的......「開始日期」可以簡單地轉換爲星期一午夜,如果在星期六/星期日...則函數中可能包括總週數......
我想知道如何計算SQL中兩個時間戳(例如2016-02-24 17:30:00和另一個時間戳)之間的「小時數」服務器 - 但不包括星期六和星期日的全部48小時期限,如果越過。SQL Sever - Datediff,小時,但不包括週六/週日
這與純粹的營業時間並不完全相同,但有點類似。其原因是囉嗦和不必要的。
編輯:我也可以說,結束日期將永遠在一週內。所以真的......「開始日期」可以簡單地轉換爲星期一午夜,如果在星期六/星期日...則函數中可能包括總週數......
DATEDIFF(Week, date, date2)
將返回周邊界數這兩個日期之間交叉。對於SQL Server,這意味着日期之間有多少個星期日(而不是它們之間的7天期間)。這意味着,如果你確實可以假定開始日期和結束日期不會是星期六或星期日,那麼你可以從你的正常DATEDIFF
呼叫中減去48 X DATEDIFF(Week, date, date2)
,那應該給你後面的東西。
你好---這是一個很好的起點。 END點不能是星期六/星期日。但是,開始日期可以。我覺得只需要檢查'開始日期'是否是星期六和星期日,然後將這個時間轉換到下一個星期一午夜,如果是的話。一旦發生,我認爲你的方法會起作用。嗯 - 我認爲這是必要的。 – user45867
我會用一個日曆表(前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
'DATEDIFF(小時,日期,DATE2) - DATEDIFF(周,DATE1,DATE2)* 48'? – ZLK
使用單個查詢很困難,因爲第一天或最後一天可能是星期六或星期日。我做了類似的事情,但整整一天[這裏](http://stackoverflow.com/a/42262116/3270427) – McNets
嗯,我看看你的例子,並可能深入挖掘它,但似乎很長的囉嗦。我正在考慮... datediff(小時,日期1,日期2)是一個很好的基線---是否有簡單的方法來計算兩個日期之間的「星期日小時」和「星期六小時」?我想這是同樣的問題。 – user45867