则DateDiff JOIN和WHERE子句

问题描述:

下面是数据: 表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记录 –

一种方法使用两个连接:

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; 

你所需的查询应该是这样的。我在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'。 –

尝试这种方式

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 

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