2015-10-21 65 views
1

我希望能夠計算出特定事件之間的總時間在SQL Server之間的總時間2008年SQL Server 2008中查詢到計算連續事件

我有一個表,如下所示:

UserId Event  EventTimestamp 
+-------+----------+---------------+ 
1  CheckedIn 14-05-15 10:01 
2  CheckedIn 14-05-15 10:15 
3  CheckedIn 14-05-15 10:17 
1  CheckedOut 14-05-15 10:25 
1  Logout  14-05-15 10:26 

如果您查看錶格,用戶可以簽入,然後可以簽出然後離線。

我想計算人員登記入住時間(入住和退房之間的時間)少於10分鐘的每週分組點數。

到目前爲止,我已經按周設法組,但我似乎無法計算這些事件之間的持續時間(這將在順序發生)......

select  
    'Week ' + cast(datepart(wk, EventUpdateStamp) as varchar(2)) Week,  
    UserId, 
    Event 
from MyTable 
group by datepart(wk, EventUpdateStamp), UserId, Event 

我想有結果是這樣的:

UserId TotalSessionCheckInTimeMinutes WeekNumber 
+-------+------------------------------+---------------+ 
1  24        43 

以第一行作爲一個例子:

  • 1是在用戶ID
  • 24是在他 入住和退房
  • 43分鐘之間的總持續時間在一年

週數,我只希望包括登記入住到退房。不想在退房和註銷之間進行衡量(換句話說,衡量他簽入的時間有多長)。

+0

你能解釋一下你的結果此行:1 10 43? 。 10意思是10:00? –

+0

SQL Server版本2008 R2 – AshesToAshes

+0

1 10 43:1是用戶的ID,24是他的入住和退房之間的總分鐘數,43是一年中的星期數。 – AshesToAshes

回答

4

試試這個:

SELECT t1.UserId, 
    DATEDIFF(minute, 
     t1.EventTimestamp, 
     (SELECT MIN(t3.EventTimestamp) 
     FROM MyTable t3 
     WHERE t3.UserId = t1.UserId 
     AND t3.EventTimestamp> t1.EventTimestamp) 
    ), 
    CAST(DATEPART(wk, EventTimestamp) as varchar(2)) Week 
FROM MyTable t1 
WHERE EXISTS(
    SELECT 'NEXT' 
    FROM MyTable t2 
    WHERE t2.UserId = t1.UserId 
    AND t2.EventTimestamp> t1.EventTimestamp 
    AND t2.Event != 'Logout') 

SqlFiddle

轉到here

+0

它給出了一個錯誤,表示它不知道't'是什麼。當我將t.UserId更改爲t1.UserId時,我得到了結果,但它們都是負值。另外,我注意到你沒有與事件進行比較? – AshesToAshes

+0

已修復。 t.UserId - > t1.UserId(我試着Sql小提琴,但今天是關閉) –

+0

是的我無法讓它在SQL小提琴上工作,但它也不適用於我:( – AshesToAshes

1

你可以試試這個:

SELECT DISTINCT M.UserId, DATEPART(HOUR,A.TotalSessionCheckInTimeMinutes)*60 + DATEPART(MINUTE,A.TotalSessionCheckInTimeMinutes) AS TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M 
    CROSS APPLY (
     SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes 
     FROM Mytable M1 
      CROSS JOIN Mytable M2 
      WHERE M1.Event = 'CheckOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A 
UNION ALL 
SELECT DISTINCT M.UserId, A.TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M 
    CROSS APPLY (
     SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes 
     FROM Mytable M1 
      CROSS JOIN Mytable M2 
      WHERE M1.Event = 'LogOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A 
+0

似乎沒有給出正確的數據,因爲它給了我一個1899年TotalSessionCheckInTimeMinutes的日期和錯誤的週數。 – AshesToAshes

+0

我覺得我的代碼出現問題:'M1.EventTimestamp - M2.EventTimestamp'。你可以使用轉換或轉換。 :) –

+0

我編輯了我的代碼。希望能幫助到你! 。 –