则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
在此先感谢您的帮助!
一种方法使用两个连接:
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
谢谢,这很接近。这个查询的问题是我需要在上面的示例中包含“Group By”字符串,以便在运行datediff函数之前以正确的方式组织数据。 – Fryguy22
@ 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
可以更改分钟,或一天日期的差异取决于你的。 希望它有帮助
这意味着你只有两条记录,1 | 2016-06-27 10:36:55.033 | 202 | 50 ------- | ----------------------- | ---------- | --- -------- 1 | 2016-06-27 10:40:37.800 | 266 | 8 cos我只是想,如果它是名单上的3记录 –