2016-07-27 165 views
0

下面是數據: 表1:則DateDiff JOIN和WHERE子句

usernum|username 
-------|-------- 
1  |JBlow 
-------|-------- 
2  |CFarley 

表2:

usernum|logdate    |actionnum |extrainfo1 
-------|-----------------------|----------|----------- 
1  |2016-06-27 10:36:55.033| 202  |50 
-------|-----------------------|----------|----------- 
1  |2016-06-27 10:40:37.800| 266  |8 
-------|-----------------------|----------|----------- 
2  |2016-06-27 10:43:18.817| 202  |23 
-------|-----------------------|----------|----------- 
2  |2016-06-27 10:48:32.413| 266  |7 

我所試圖做的是加入'Usernum'上的表格,以便我可以在結果中獲取用戶名。

接下來,我想使用datediff計算表2中日誌之間的時間(以分鐘爲單位)。表2中的每個條目都有一個與它關聯的動作號。在這種情況下,我想查找與操作數202(start)關聯的logdate和與操作數266(end)關聯的logdate之間的區別。

我也想包含只有202個actionnum行的extrainfo1。

最後的結果我要找的有以下欄目: 用戶名,{DATEDIFF結果},extrainfo1

這裏是我想出了將顯示用戶名,LOGDATE,extrainfo1和actionnum查詢。我已經用一個子查詢來試用了datediff函數,但一直未能實現,但我不是專家。

SELECT a.username, b.logdate, b.extrainfo1 AS 'DocumentCount', b.actionnum 
FROM hsi.useraccount a 
    LEFT JOIN hsi.scanninglog b 
    ON a.usernum = b.usernum 
WHERE b.actionnum = 266 
OR b.actionnum = 202 
GROUP BY a.username,b.logdate, b.extrainfo1, b.actionnum 

在此先感謝您的幫助!

+0

這意味着你只有兩條記錄,1 | 2016-06-27 10:36:55.033 | 202 | 50 ------- | ----------------------- | ---------- | --- -------- 1 | 2016-06-27 10:40:37.800 | 266 | 8 cos我只是想,如果它是名單上的3記錄 –

回答

0

一種方法使用兩個連接:

SELECT ua.*, sls.*, 
     dateadiff(day, sls.logdate, sle.logdate) as diff_in_days 
FROM hsi.useraccount ua LEFT JOIN 
    hsi.scanninglog sls 
    ON ua.usernum = sls.usernum AND sls.actionnum = 202 LEFT JOIN 
    hsi.scanninglog sle 
    ON ua.usernum = sle.usernum AND sle.actionnum = 266; 
0

你所需的查詢應該是這樣的。我在hsi.scanninglog上加入了兩次來表示開始和結束日誌。

SELECT 
    a.username 'Username', 
    CASE 
     WHEN c.logdate IS NULL THEN 0 
     ELSE datediff(minute, b.logdate, c.logdate) 
    END 'Login Duration', 
    b.extrainfo 'Extra Info' 
FROM 
    hsi.useraccount a 
    LEFT JOIN hsi.scanninglog b 
     ON b.usernum = a.usernum AND b.actionnum = 266 -- Start 
    LEFT JOIN hsi.scanninglog c 
     ON c.usernum = a.usernum AND c.actionnum = 202 -- END 
GROUP BY 
    a.username, 
    b.extrainfo 
+0

謝謝,這很接近。這個查詢的問題是我需要在上面的示例中包含「Group By」字符串,以便在運行datediff函數之前以正確的方式組織數據。 – Fryguy22

+0

@ Fryguy22更新了我的答案。我太專注於你提供的樣本數據,並沒有注意到'extrainfo'值。猜測在'scanninglog'中會有超過2條用戶記錄的情況,但具有不同的'extrainfo'。 –

0

嘗試這種方式

select a.usernum,minlog,maxlog,datediff(minute,minlog,maxlog) as diff from 
(select usernum,min(logdate) as minlog from tbl_log group by usernum) as a 
left join 
(select usernum,max(logdate) as maxlog from tbl_log group by usernum) as b 
on a.usernum = b.usernum 

可以更改分鐘,或一天日期的差異取決於你的。 希望它有幫助