行项的SQL datediff

时间:2014-11-19 06:52:59

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

我发现编写SQL语句很难计算每行行的时间。

我的表结构很简单:

TblProduct(Product nvarchar(50), Serial nvarchar(50), Time_Checked datetime)

以下是我的示例数据: -

PRODUCT1 Serial1 2014-04-02 07:01:21.000
PRODUCT1 Serial2 2014-04-02 07:02:21.000
PRODUCT1 Serial3 2014-04-02 07:03:21.000
PRODUCT2 Serial1 2014-04-02 08:01:21.000
PRODUCT2 Serial2 2014-04-02 08:02:21.000
PRODUCT2 Serial3 2014-04-02 08:03:21.000
PRODUCT3 Serial1 2014-04-02 09:01:21.000
PRODUCT3 Serial2 2014-04-02 09:02:21.000
PRODUCT3 Serial3 2014-04-02 09:03:21.000
PRODUCT1 Serial4 2014-04-02 10:01:21.000
PRODUCT1 Serial5 2014-04-02 10:02:21.000
PRODUCT2 Serial6 2014-04-02 10:03:21.000

我想按datediff(minute,start time, end time)计算更改产品的时间 其中开始时间是每个产品系列的最后一项

开始时间:PRODUCT1 2014-04-02 07:03:21.000

结束时间:PRODUCT2 2014-04-02 08:01:21.000

==> datediff(minute,start time, end time)=58 minutes

最后,我想返回一个如下表所示的结果: -

PRODUCT1 Serial3 PRODUCT2 Serial1 58(minutes)
PRODUCT2 Serial3 PRODUCT3 Serial1 58(minutes)
PRODUCT3 Serial3 PRODUCT4 Serial4 58(minutes)

1 个答案:

答案 0 :(得分:0)

Here是一个可以在sql server 2008和2012上运行的解决方案:

;WITH cte_temp
     AS (SELECT *,
                ROW_NUMBER()
                  OVER (
                    ORDER BY Time_Checked) AS rownum
         FROM   TblProduct)
SELECT t1.Product,
       t1.Serial,
       t2.Product,
       t2.Serial,
       Datediff(MINUTE, t1.Time_Checked, t2.Time_Checked) AS DiffInMinutes
FROM   cte_temp t1
       JOIN cte_temp t2
         ON t1.rownum + 1 = t2.rownum
WHERE  t1.Product <> t2.Product 
cte_temp中的

查询将按Time_Checked的升序为每行分配一个增量编号,cte_temp上的t1.rownum + 1 = t2.rownum的自加入结果将与下一行匹配当前行。最后,where子句将过滤掉所需的行。

注意:如果您使用的是sql server 2012,可以使用lead()lag()函数完成同样的事情。