2017-02-28 103 views
0

我想知道如何計算SQL中兩個時間戳(例如2016-02-24 17:30:00和另一個時間戳)之間的「小時數」服務器 - 但不包括星期六和星期日的全部48小時期限,如果越過。SQL Sever - Datediff,小時,但不包括週六/週日

這與純粹的營業時間並不完全相同,但有點類似。其原因是囉嗦和不必要的。

編輯:我也可以說,結束日期將永遠在一週內。所以真的......「開始日期」可以簡單地轉換爲星期一午夜,如果在星期六/星期日...則函數中可能包括總週數......

+2

'DATEDIFF(小時,日期,DATE2) - DATEDIFF(周,DATE1,DATE2)* 48'? – ZLK

+0

使用單個查詢很困難,因爲第一天或最後一天可能是星期六或星期日。我做了類似的事情,但整整一天[這裏](http://stackoverflow.com/a/42262116/3270427) – McNets

+0

嗯,我看看你的例子,並可能深入挖掘它,但似乎很長的囉嗦。我正在考慮... datediff(小時,日期1,日期2)是一個很好的基線---是否有簡單的方法來計算兩個日期之間的「星期日小時」和「星期六小時」?我想這是同樣的問題。 – user45867

回答

1

DATEDIFF(Week, date, date2)將返回周邊界數這兩個日期之間交叉。對於SQL Server,這意味着日期之間有多少個星期日(而不是它們之間的7天期間)。這意味着,如果你確實可以假定開始日期和結束日期不會是星期六或星期日,那麼你可以從你的正常DATEDIFF呼叫中減去48 X DATEDIFF(Week, date, date2),那應該給你後面的東西。

+0

你好---這是一個很好的起點。 END點不能是星期六/星期日。但是,開始日期可以。我覺得只需要檢查'開始日期'是否是星期六和星期日,然後將這個時間轉換到下一個星期一午夜,如果是的話。一旦發生,我認爲你的方法會起作用。嗯 - 我認爲這是必要的。 – user45867

0

我會用一個日曆表(前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得到小時數。

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 
相關問題