2016-04-28 68 views
2

基本上,此查詢假設計算用戶登錄到我們的應用程序的時間(分鐘)。它可能很簡單,但我現在無法理解它。我遇到的問題是,有時候我們的一兩個用戶會有時間毫無意義。這樣一個用戶有一天會有23分鐘的時間,而下一個用戶的時間應該幾乎相同。爲什麼此SQL查詢返回計算時間錯誤?

示例數據:

+----------------+----------+ 
| ava_modifiedby | Time | 
+----------------+----------+ 
| RSCHIFFELBEIN | 20:22:08 | 
| TMORRIS  | 13:41:57 | 
| TATKINS  | 13:23:01 | 
| MATTECH1  | 07:59:49 | 
| R5    | 07:02:23 | 
+----------------+----------+ 


SELECT DISTINCT 
    A.ava_modifiedby, 
    CONVERT(VARCHAR, DATEADD(ss, ((SUM(DATEPART(hh, A.ava_changed) * 3600 + DATEPART(mi, A.ava_changed) * 60 + DATEPART(ss, A.ava_changed)) - SUM(DATEPART(hh, B.ava_changed) * 3600 + DATEPART(mi, B.ava_changed) * 60 + DATEPART(ss, B.ava_changed))) % 86400), 0), 108) AS TIME 
FROM R5AUDVALUES A 
LEFT OUTER JOIN R5AUDVALUES B ON A.ava_primaryid = B.ava_primaryid 
WHERE A.ava_table = 'R5SESSIONS' 
    AND A.ava_deleted = '+' 
    AND A.ava_to IS NULL 
    AND B.ava_table = 'R5SESSIONS' 
    AND B.ava_inserted = '+' 
    AND B.ava_from IS NULL 
    AND A.ava_modifiedby <> '*' 
    AND B.ava_modifiedby <> '*' 
GROUP BY A.ava_modifiedby 
+0

請告訴我們的模式和一些示例數據與奇怪你描述 – n8wrl

+0

我現在看到示例數據,但我不明白你在哪裏確定登錄時間 – n8wrl

+0

我不太確定我自己,因爲這是一個我沒有經歷過的數據庫。我很確定他們從不同的來源獲得,然後這個查詢解決了總時間。 –

回答

1

沒有從表中看到您的實際行例子,這是很難說,但我認爲這樣的事情會工作

SELECT DISTINCT 
A.ava_modifiedby, CONVERT(varchar, DATEADD(ss, 
DateDiff(ss, a.ava_changed, b.ava_changed), 0), 108) AS TIME 
FROM R5AUDVALUES A 
LEFT OUTER JOIN R5AUDVALUES B ON A.ava_primaryid = B.ava_primaryid 
WHERE A.ava_table = 'R5SESSIONS' 
    AND A.ava_deleted = '+' 
    AND A.ava_to IS NULL 
    AND B.ava_table = 'R5SESSIONS' 
    AND B.ava_inserted = '+' 
    AND B.ava_from IS NULL 
    AND A.ava_modifiedby <> '*' 
    AND B.ava_modifiedby <> '*' 
GROUP BY A.ava_modifiedby 
+0

這工作! DATEDIFF是我應該使用的。謝謝! –

1

你是在你的問題與你正在做的數學複雜。 DATEDIFF英里間隔爲您提供兩個日期時間之間的總分鐘數。

DATEDIFF(mi,A.ava_changed,B.ava_changed)