2016-02-05 28 views
1

我是MS SQL新手,我很难获得正确的结果。我目前有一个表格,其中包含标题updateddate(日期),addedby(编号),operationid(编号)和servicereqno(编号),这些表格已从三个不同的表中选择。同一列中的事件之间的日期差异

operationid是一个事件,servicereqno是一个工作号码。我希望能够获得事件之间的时间差,然后一旦建立,就可以计算出平均值。

例如:

  • OPID 512是在20:15 - servicereqno 1
  • OPID 535是在21:23 - servicereqno 1

我的首要任务将是确定什么时间上的差异在于,确保它在同一个工作号码内。

非常感谢

+0

这是现在我输入的语法,但它不工作:第一站现在是基于高亮显示的区域,它表示是一个'无效的对象名'我不明白为什么这是无效的,当它是对象名: – AJ1791

+0

选择CHANGE.UPDATEDDATE,CHANGE.ADDEDBY,S_OPERATION.OPERATIONID,CHANGE.SERVICEREQid 从变更INNER JOIN CHANGE_H ON CHANGE.SERVICEREQNO = CHANGE_H.SERVICEREQNO INNER JOIN S_OPERATION ON CHANGE_H.OPERATIONID = S_OPERATION.OPERATIONID WHERE(S_OPERATION。 OPERATIONID = 102005212)或 (S_OPERATION.OPERATIONID = 102005218)或 (s_operation.operationid = 102005406)或(s_operation.operationid = 102005401)或 (s_operation.operationid = 102005215); WITH cteOps AS( – AJ1791

+0

SELECT row_number()OVER(PARTITION BY change.servicereqno ORDER BY change.updateddate)seqid,change.updateddate,change.servicereqno FROM ** CHANGE.updateddate,change.addedby,s_operation.operationid,change.servicereqno) ** SELECT DATEDIFF(毫秒,o1.updateddate,o2.updateddate)updateddatediff,servicereqno FROM cteOps o1 JOIN cteOps o2 ON o1.seqid = o2.seqid + 1 AND o1.servicereqno = o2.servicereqno; – AJ1791

回答

0

SQL Server提供了a built-in DATEDIFF function,你可以用它来找到两个日期之间的差值。此外,SQL Server有a built-in AVG function,您可以使用它来计算一组值的平均值。

+0

我认为这并没有真正回答这个问题,因为它忽略了如何真正获得事件之间的持续时间。 – Lucero

+0

在我看来,问题是关于如何区分两次之间的差异。问题的标题是“同一列中的事件之间的日期差异”,并且帖子以“我的第一个任务将确定时间差异是什么”结束。 'DATEDIFF'功能可以实现这个功能。我会编辑我的答案,使其更清楚。 –

+0

丹,重点是“在同一列” - 如何将'DATEDIFF()'应用到多行? – Lucero

1

为了获得事件之间的时间间隔,您需要按顺序对所有操作进行编号(一次增加而不剩),然后加上它自己的偏移量为1.你会得到n-1行,其结果是时间间隔。

事情是这样的:

WITH cteOps AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY servicereqno ORDER BY updateddate) seqid, updateddate, servicereqno 
    FROM yourdatasource 
) 
SELECT DATEDIFF(millisecond, o1.updateddate, o2.updateddate) updateddatediff, servicereqno 
    FROM cteOps o1 
    JOIN cteOps o2 ON o1.seqid=o2.seqid+1 AND o1.servicereqno=o2.servicereqno; 

当然你也可以在执行聚集,以获得平均或任何你需要的。

+0

OP的问题有点含糊不清,但我认为你需要一个ROWNUMBER()OVER(通过servicereqno ORDER BY updateddate分区)AS seqid'。否则,你正在比较不同的servicereqno ......无论如何,正如我所说,OP的问题在这个问题上有点太模糊。 –

+0

@TT,是的,在这一点上是模糊的。我最初只是为了简单而离开了它,但现在我已经按照建议编辑了代码,并且还将'servicereqno'添加到'JOIN',以便它返回正确的结果。 – Lucero

+0

感谢您的反馈,作为新的这一点,我不确定为什么这不适合我,我越来越ROWNUMBER和结束是无效的ROW_NUMBER是,但我不知道该怎么改变OVER。 – AJ1791