【问题标题】:SQL query: time differenceSQL查询:时差
【发布时间】:2009-07-15 15:35:02
【问题描述】:

对于所有 SQL Server 视图专家来说,这似乎是一个蹩脚的问题,但是...

所以我有我的客户需要用于报告目的的一小部分数据。我不得不承认,虽然我确实问过他们的报告要求,但直到现在我才发现我的数据库可以得到更好的优化。

他们想要的数据之一是可能已经运行的两个任务之间的时间差:

select caseid, hy.createdate
from app_history hy
where hy.activityid in (303734, 303724)

这为每个案例提交提供了两行(编辑后),然后必须对其进行测量;但有一些摆动: 活动 303734 将始终运行,活动 303724 可能会运行。 每个 303734 和 303724 组合匹配。可以想象,在第二次提交之后,一个案例可以有 1 个不匹配的 303734 和一个匹配的对。匹配这些可能取决于直觉。不好。 每个 caseid 可能有多个提交,如果是这种情况,那么这两个活动将在以后的每次运行。 无法将提交编号写入此表。

app_history 表保存 userid、caseid 和 activityid 作为外键。 PK 是标识列 ID。

有没有更好的方法来编写查询?

在 KM 的帮助下:

select
    c.id, c.submissionno, hya.caseid, hya.createtime, hyb.caseid, hyb.createtime
    ,CASE
         WHEN hyb.caseid IS NOT NULL THEN DATEDIFF(mi,hya.createtime,hyb.createtime)
         ELSE NULL
     END AS Difference 
    from app_case c
        inner join app_history hya on c.id = hya.caseid 
        left outer join  app_history hyb on c.id = hyb.caseid  
    where hya.activityid in (303734) and hyb.activityid in (303724) order by c.id asc

这几乎可行。

我现在有这个问题:

460509|2|460509|15:15:39.000|460509|15:16:13.000|1
460509|2|460509|15:15:39.000|460509|15:18:13.000|3
460509|2|460509|15:17:52.000|460509|15:16:13.000|-1
460509|2|460509|15:17:52.000|460509|15:18:13.000|1

所以我现在得到 1 行,比较这四行中的每一行……嗯,我认为这是我所希望的最好的。 :(

【问题讨论】:

  • 当你说“总是跑”和“可能跑”时,这是否意味着他们的createdate 可能没有设置/是NULL
  • 如果activity没有运行那么它不会被写入app.history表中。
  • SQL Server什么版本,app_history的PK是什么(是身份吗?)
  • SQL server 2005。PK 是 app_history.ID

标签: sql-server datetime time views


【解决方案1】:

使用左连接

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM app_history                a
        LEFT OUTER JOIN app_history b ON b.activityid=303724
    WHERE a.activityid=303734

EDIT 在获得更多架构信息之后...

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM (SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303734)                 aa
        INNER JOIN app_history                                                               a ON aa.MaxID=a.ID
        LEFT OUTER JOIN a(SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303724) bb ON 1=1
        LEFT OUTER JOIN app_history                                                          b ON bb.MaxID=b.ID

【讨论】:

  • 其实我认为这行不通……反正不是我期望的那样。它似乎将每个“b”行与每个“a”行进行比较。
  • 嗨,我在 dev 的 app.history 中只有 3649 行。上面的查询返回了 55605 行。
  • @Sean,activityid 在 app_history 中是唯一的吗???如果没有,那么这将不起作用。您必须获取每个 activityid 的最后输入行,并在 LEFT JOIN 和 WHERE 中使用主键值
  • app_history 的主键是什么?
  • 哦..好的。是的,activityid 会在历史表中出现很多很多次。
【解决方案2】:

做这样的事情


select datediff(
day,
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303734),
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303724)
)

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多