DateDiff在2个记录的同一列中,带有JOIN和WHERE子句

时间:2016-07-27 23:47:03

标签: sql sql-server join datediff

以下是数据: 表1:

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

我想要做的就是加入“用户界面”中的表格。这样我就可以在结果中获取用户名。

接下来,我想使用datediff来计算表2中的logdates之间的时间分钟。表2中的每个条目都有一个与之关联的actionnum。在这种情况下,我想找到与actionnum 202(start)关联的logdate和与actionnum 266(end)关联的logdate之间的区别。

我还想从202个actionnum行中包含extrainfo1。

我要找的最终结果将包含以下列: username,{datediff result},extrainfo1

这是我提出的一个查询,它将显示用户名,logdate,extrainfo1和actionnum。我已经尝试了带有子查询的约会功能,并且无法使其工作,但我不是专家。

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

提前感谢您的帮助!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分: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

你可以改变分钟或日期差异,它取决于你的。 希望它有所帮助