2011-09-21 41 views
0

我有一個查詢返回這個「表」下面的sql服務器。查詢使用一些連接將數據鏈接在一起。我想要做的就是將每位訪問員記錄在時間上,並且此時將NULL轉換爲時間。我如何將登錄和註銷日期時間戳記彙總爲登錄時間,然後將時間替換爲NULL - 在T-SQL中?

 
INTERVIEWER NUM_COMPLETES projectId loginDateTime logoutDateTime 
002    2 43407  2011-09-20 22:59:15.193 NULL 
004    1 43407  2011-09-20 23:06:32.287 NULL 
007    1 43407  2011-09-20 23:02:30.930 NULL 
007    1 43407 2011-09-20 00:37:01.213 2011-09-20 01:15:00.197 
010    3 43407  2011-09-20 23:04:46.547 NULL 
013    1 43407 2011-09-20 00:36:16.923 2011-09-20 01:14:59.440 
029    3 43407 2011-09-20 22:58:55.083 2011-09-20 23:30:56.987 
029    3 43407 2011-09-20 23:31:05.243 2011-09-21 00:02:27.560 
029    3 43407  2011-09-21 00:02:55.527 NULL 
032    1 43407  2011-09-20 22:59:19.590 NULL 
036    1 43407  2011-09-20 23:02:33.497 NULL 
041    1 43407  2011-09-20 22:59:55.020 NULL 

應該變成

 
INTERVIEWER NUM_COMPLETES projectId TotalTime 
002    2  43407   8 
004    1  43407   10 
007    1  43407   4 
008    1  43407   7 

這就像每面試官總結日期差異。

下面是一個簡單+消毒TSQL語句,我使用


SELECT tbl1.INTERVIEWER, tbl1.NUM_COMPLETES, tbl2.projectId, tbl2.loginDateTime, tbl2.logoutDateTime 
FROM 
(
SELECT k_Id, FirstName AS INTERVIEWER, COUNT(result) AS NUM_COMPLETES 
FROM db1_table, db2_table 
WHERE k_Id=Interviewer 
GROUP BY k_Id, FirstName, result 
) AS tbl1 
INNER JOIN 
(
SELECT projectId, loginDateTime, logoutDateTime, userId 
FROM session_tbl 
WHERE loginDateTime >= '2011-09-20 0:0:0.0' AND projectId = '43407' 
) AS tbl2 
ON tbl1.k_Id=tbl2.userId 
ORDER BY INTERVIEWER 

感謝您的幫助 - 我一直是這樣,過去幾天的掙扎!

+0

您是否嘗試過轉換爲UNIX時間戳和總推導在數字值? –

+0

這聽起來像它會工作,但我沒有真正處理MSSQL中的UNIX時間戳 – Ryan

+0

可能的完整解決方案n需要考慮相交的登錄/註銷。 http://explainextended.com/2009/06/11/flattening-timespans-sql-server/ – Ryan

回答

1

你應該可以使用標準GROUP BY來做到這一點。

select 
    userId, 
    projectId, 
    sum(datediff(hour, loginDateTime, isnull(logoutDateTime, getdate()))) as totalHours 

from session_tbl 

group by userId, projectId 
+0

這工作!我得到一些結果是負面的,我不知道如何處理。 – Ryan

+0

對不起,讓我再澄清一點評論,我收回TotalTime中的一些行作爲負數 - 不知道爲什麼,因爲它是加法! – Ryan

+0

@RMacy:運行以下查詢並查看是否得到任何結果:'select * from session_tbl where loginDateTime> logoutDateTime or(loginDateTime> getdate()and logoutDateTime is null)'。如果是這樣,你的數據不好。 –

0

我不知道這是否會幫助你,但它是什麼經歷我的頭。

我個人認爲只有在用戶註銷時,php才輸入這些值(訪問者NUM_COMPLETES項目ID總時間)。有一個記錄會話的表格(登錄時間,最後一次印象和登出時間{如果用戶剛剛關閉瀏覽器並默認爲最後一次印象},然後簡化SQL)

它也可以是安全措施檢查,一切都定期匹配。

個人只有這麼久,我會的東西打在我開始不同的方式來達到同樣的效果思考。

+0

謝謝你的建議! – Ryan

相關問題