2015-12-04 63 views
0

我想計算用戶的中斷持續時間(中斷持續時間=解鎖鎖定時間)。如何計算SQL中同一列中兩個日期之間的持續時間

任何人都可以請告訴我如何計算。下面

是我的表

Event id EventDate      EventType   Userid 
1  2015-11-05 13:54:28.900  Login    10 
2  2015-11-05 13:55:27.527  Lock     10 
3  2015-11-05 13:55:27.537  Break    10 
4  2015-11-05 13:55:37.037  Unlock    10 
5  2015-11-05 13:56:13.953  Break    10 
7  2015-11-05 14:33:26.347  Login    10 
8  2015-11-05 14:33:46.243  TaskStartedInManual 10 
9  2015-11-05 14:34:34.570  TaskPause   10 

我休息公式並不總是一樣的。在下面的例子中,我的Break事件處於Login-Taskpause之間。因此,基本上每當EventType出現中斷時,就計算Date-Next行的前一行。如何實現這一點?

EventId EventDate    EventType Userid 
1 2015-11-05 13:54:28.900 Login  10 
2 2015-11-05 13:55:27.527 Lock   10 
3 2015-11-05 13:55:27.537 Break  10 
4 2015-11-05 13:55:37.037 Unlock  10 
5 2015-11-05 14:33:26.347 Login  10 
6 2015-11-05 14:33:46.243 Break  10 
7 2015-11-05 14:34:34.570 TaskPause 10 

所需的輸出將是

Userid Break_Duration(In sec) 
10   10 
10   68 
+0

你可以發佈你的願望輸出嗎? –

+0

你能解釋爲什麼是68,我沒有看到產生什麼價值。 –

+0

值68來自日期差異Login-TaskPause例如選擇DATEDIFF(s,'2015-11-05 14:33:26.347','2015-11-05 14:34:34.570') – Rajashri

回答

2

ASIGN一個ID給每個事件類型,然後由該ID匹配計算DATEDIFF

Sql Fiddle Demo

with cte as (
     SELECT s.*, 
      row_number() over (partition by [EventType] order by [EventDate]) as rn 
     FROM shift s 
) 
SELECT L.[Userid], DATEDIFF (second, L.[EventDate], U.[EventDate]) as breaktime_seconds 
FROM cte U -- unlock 
JOIN cte L -- lock 
    ON U.rn = L.rn 
AND U.[Userid] = L.[Userid] 
WHERE U.[EventType] = 'Unlock' 
    AND L.[EventType] = 'Lock' 
ORDER BY L.[Userid] 

OUTPU牛逼

| Userid | breaktime_seconds | 
|--------|-------------------| 
|  10 |    10 | 
+0

我的休息公式並不總是相同的。在下面的例子中,我的休息事件介於 Login-Taskpause.So基本上每當EventType出現中斷時計算Date-Next的前一行date.How可以實現嗎? EVENTID EVENTDATE的EventType用戶標識 2015年11月5日13:54:28.900 \t登錄10 2015年11月5日13:55:27.527 \t鎖10 2015年11月5日13時55分: 27.537 \t歇10 2015年11月5日13:55:37.037解鎖10 2015年11月5日14:33:26.347 \t登錄10 2015年11月5日14:33:46.243 \t歇10 2015-11-05 14:34:34.570 \t TaskPause 10 – Rajashri

+0

將您的案例放在您的任務中離不開評論。 –

+0

謝謝。添加了相關示例 – Rajashri

0

您將需要使用DATEDIFF功能來做到這一點:

DATEDIFF('d', [COLUMN1], [COLUMN2])其中d是差的,你想(天在這個例子中)類型

請參閱MSDN DATEDIFF頁瞭解全部細節。

相關問題