【问题标题】:time differense in the lines sql Server 2008 r2sql Server 2008 r2 行中的时差
【发布时间】:2015-06-02 18:51:15
【问题描述】:

我有一个 select 语句,其中 3 列和 n 行如下:

number of the equipment    time some                 count
0128                       2015-05-26 20:31:57.000   1
0128                       2015-05-27 06:53:12.000   1
0128                       2015-05-27 06:58:04.000   1

如何在这些时间之间找到datediff 如果记录为 2,则可以在一行中删除 maxmin 时间,但记录数总是不同

我需要比较。例如datediff(mm,time1,time2) < 60 min then.....如果记录数不断变化,我如何比较time1-time2time2 - time3

我的代码

DECLARE @start_date DATE, @end_date DATE, @equip varchar(4), @shift_ident varchar(2)

SET @start_date = '2015-05-27'

SET @end_date = '2015-05-27'

SET @shift_ident = '1'

SET @equip ='0128'

;with cte as (SELECT ROW_NUMBER() over(ORDER BY START_TIMESTAMP) num, 
    EQUIP_IDENT as eq ,
    START_TIMESTAMP as time,
    count(STATUS_CODE) as Zapravka
from EQUIPMENT_STATUS_TRANS
WHERE STATUS_CODE = 'O23'
    AND SHIFT_DATE between @start_date and @end_date
    AND @shift_ident LIKE '%' + SHIFT_IDENT + '%'
    AND EQUIP_IDENT = @equip
    GROUP BY EQUIP_IDENT,START_TIMESTAMP)
SELECT est.time, DATEDIFF(mm, est.time,est2.time) as duration
from cte est
join cte est2 on est.num = est2.num-1

结果

2015-05-26 20:31:57.000 0
2015-05-27 06:53:12.000 0

持续时间 = 0...为什么?

【问题讨论】:

标签: sql-server sql-server-2008-r2


【解决方案1】:

我假设您只想比较两个连续的行。您可以按日期时间列排序行(使用row_number() 函数)并通过相邻行号进行自连接。

;with cte as (
select
    *, [rwn] = row_number() over(partition by 1 order by dt asc, no asc )
from ( 
    select '0128',cast('2015-05-26 20:31:57.000' as datetime2(3)),1 union all
    select '0128','2015-05-27 06:53:12.000',1 union all
    select '0128','2015-05-27 06:58:04.000',1 
) x (no,dt,cnt) 
)

select
    *,
    diff = datediff(mm,c2.dt, c1.dt)
from cte c1
join cte c2
    on c1.rwn+1=c2.rwn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多