【问题标题】:DateDiff within the same column of 2 records with a JOIN and WHERE clauses具有 JOIN 和 WHERE 子句的 2 条记录的同一列中的 DateDiff
【发布时间】:2016-07-27 23:47:02
【问题描述】:

数据如下: 表 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

我要做的是加入“Usernum”上的表,以便我可以在结果中获取用户名。

接下来,我想使用 datediff 来计算表 2 中日志日期之间的时间(以分钟为单位)。表 2 中的每个条目都有一个与之关联的 actionnum。在这种情况下,我想找出与 actionnum 202(start) 关联的 logdate 和与 actionnum 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

提前感谢您的帮助!

【问题讨论】:

  • 表示你只有两条记录,1 |2016-06-27 10:36:55.033| 202 |50 --------|-----------|------------|---- ------- 1 |2016-06-27 10:40:37.800| 266 |8 因为我只是在想如果它是列表中的 3 条记录怎么样

标签: sql sql-server join datediff


【解决方案1】:

一个方法使用两个连接:

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;

【讨论】:

    【解决方案2】:

    试试这个方法

    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
    

    您可以更改分钟或日期差异,具体取决于您的时间。 希望对你有帮助

    【讨论】:

      【解决方案3】:

      您想要的查询应如下所示。我在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 更新了我的答案。我过于关注您提供的示例数据,没有注意到 extrainfo 值。猜想scanninglog 中的用户会有超过 2 条记录但extrainfo 不同的情况。
      猜你喜欢
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      相关资源
      最近更新 更多