2015-01-21 296 views
0

我一直在解決一些事情。我如何檢查時間範圍是否在另一個時間範圍之間?檢查時間範圍是否在另一個時間範圍

例如,我如何檢查11:00 AM - 12:00 PM是在9:30 AM - 2PM之間? 我需要這個開發計時系統來檢查員工的病假是否涵蓋他的計劃休息時間。使用SQL Server 2008

declare @timefrom datetime 
declare @timeto datetime 
declare @timefromBreak datetime 
declare @timetoBreak datetime 

set @timefrom = cast('01/21/2015 11:30:00' as datetime) 
set @timeto = cast('01/21/2015 14:00:00' as datetime) 
set @timefromBreak = cast('01/21/2015 11:00:00' as datetime) 
set @timetoBreak = cast('01/21/2015 12:00:00' as datetime) 

select 
case when ((@timefromBreak between @timefrom and @timeto) AND (@timetoBreak between @timefrom and @timeto)) then 
(datediff(hour, @timefrom,@timeto) - datediff(hour,@timefromBreak,@timetoBreak)) 

else datediff(hour, @timefrom,@timeto) 

end as TotalLeaveHours 

我在這裏是我的例子..我嘗試獲得總休假小時的員工申請休假了。

的邏輯是,我將獲得的總休假時間不包括休息時間(當且僅當休假時間範圍涵蓋了休息時間。)

因此,如果僱員提出了請假11:30 PM到下午2點,他的預定休息時間是從11:00到12:00。總休假時間應該只有2個小時。

上午11:30至下午12:00不應該算對,因爲他的計劃的總時間休假時間爲上午11:00至下午12:00 ..

+1

您的表格是什麼樣的?什麼是數據和你期望的輸出?最重要的是你嘗試過什麼? – 2015-01-21 07:17:06

+0

確定重疊有一個非常簡單的規則 - 兩個時間段重疊,如果第一個在第二個結束之前開始*和*第二個在第一個結束之前開始 - 但是,根據您發佈的答案,實際上是試圖圍繞重疊進行一些計算 - 所以你可以編輯你的問題並添加一些示例數據和預期結果 - 我們不需要很多,但是多於一個*單個的例子可能是有益的。 – 2015-01-21 07:51:30

+0

謝謝,我會.. – 2015-01-21 08:03:14

回答

1

這計算的時間差(以分鐘爲單位的時刻),並試圖採取一切可能的重疊護理:

declare @timefrom datetime 
declare @timeto datetime 
declare @timefromBreak datetime 
declare @timetoBreak datetime 

select @timefrom = '2015-01-21T11:30:00',@timeto = '2015-01-21T14:00:00', 
     @timefromBreak = '2015-01-21T11:00:00',@timetoBreak = '2015-01-21T12:00:00' 

select DATEDIFF(minute,@timefrom,@timeto) - 
CASE WHEN @timeFrom < @timeToBreak AND @timefromBreak < @timeTo THEN 
    DATEDIFF(minute, 
     CASE WHEN @timeFrom > @timeFromBreak THEN @timeFrom ELSE @timeFromBreak END, 
     CASE WHEN @timeTo < @timeToBreak THEN @timeTo ELSE @timeToBreak END 
    ) ELSE 0 END 

希望,你能看到的基本邏輯 - 我們總是計算時間差異 - 然後我們檢查是否存在重疊。只有存在重疊時,我們才需要調整總時間,並且我們使用幾個CASE表達式來計算何時休息時間和休假時間部分重疊或完全重疊。

(如果SQL Server有MINMAX功能,對多種參數,而不是多行的工作,那麼後來CASE表達式會剛剛MAX(@timeFrom,@timeFromBreak)MIN(@timeTo,@timeToBreak)


由於一些你似乎正在與你合作的例子2。5小時,我認爲在幾分鐘內工作會更安全,並讓您進行最終調整/向下/向上作爲最後一步,與這些計算分開

+0

然後我會把它分成60以獲得小時?我將@timefrom更改爲'2015-01-21T09:30:00',我得到的是整數3而不是3.5(帶小數) – 2015-01-21 08:18:44

+0

@bob_tiamsic - 如果將當前結果除以60(整數除法)你會得到幾個小時,但你會失去任何小數部分(例如150/60 = 2),我不確定這是你的總體預期結果,或者你是想保留小數部分還是總計 – 2015-01-21 08:20:54

+0

得到它!試圖投(作爲小數(3,2))非常感謝你!這是非常有幫助和信息!上帝保佑先生! – 2015-01-21 08:26:38

0

4是總的休假時間..

對不起,我想弄個混亂..我需要得到總小時數......我試過了,如果休假時間範圍將覆蓋整個休息時間,我認爲不會有衝突..如果只有部分休息時間將被覆蓋,第一個條件將是虛假的。

如果員工的休息時間是上午11:00到下午12:00,那麼他提交的休假是從上午11:30到2: 00Pm總假期應只返回3小時,而不是2.5小時。

在我的測試,

declare @timefrom datetime 
declare @timeto datetime 
declare @timefromBreak datetime 
declare @timetoBreak datetime 

set @timefrom = cast('01/21/2015 11:30:00' as datetime) 
set @timeto = cast('01/21/2015 14:00:00' as datetime) 
set @timefromBreak = cast('01/21/2015 11:00:00' as datetime) 
set @timetoBreak = cast('01/21/2015 12:00:00' as datetime) 

select 
case when ((@timefromBreak between @timefrom and @timeto) AND (@timetoBreak between @timefrom and @timeto)) then 
(datediff(hour, @timefrom,@timeto) - datediff(hour,@timefromBreak,@timetoBreak)) 

else datediff(hour, @timefrom,@timeto) 

end as TotalLeaveHours 

這個返回3個小時,因爲它不符合在Select Case語句的首要條件。

相關問題