当前记录和先前记录之间的时间差(带有滞后变量和case语句)

时间:2019-01-30 17:15:20

标签: sql-server tsql datetime case

如果记录在同一天发生,我想计算SQL中后续记录之间的时间。

我有一张类似的表格,其中包含同一设备的1月24日至25日的数据:

EQUIPMENTNUMBER | TimeOfDay |月|周数|日年份
10020576 |上午4:18:58 | 1 | 4 | 24 | 2019
10020576 |上午4:57:23 | 1 | 4 | 24 | 2019
10020576 |上午3:22:47 | 1 | 4 | 25 | 2019
10020576 |上午4:19:14 | 1 | 4 | 25 | 2019

我能够在case语句中使用lag变量来标识先前的记录是否与当前记录发生在同一天。使用以下代码,得到下表:

SELECT  
EQUIPMENTNUMBER,   
[TimeOfDay],   
Month,  
WeekNumber,  
Day,   
Year,  
CASE  
    WHEN Day = lag(day,1,0) over (order by EQUIPMENTNUMBER, YEAR, WeekNumber,  
 DAY,timeofday) 
THEN 1 
ELSE 0   
END as [PreviousRecordOnSameDay]  
FROM [Table]

EQUIPMENTNUMBER | TimeOfDay |月|周数|日年份PreviousRecordOnSameDay
10020576 |上午4:18:58 | 1 | 4 | 24 | 2019 | 0
10020576 |上午4:57:23 | 1 | 4 | 24 | 2019 | 1
10020576 |上午3:22:47 | 1 | 4 | 25 | 2019 | 0
10020576 |上午4:19:14 | 1 | 4 | 25 | 2019 | 1

因此,现在我有一个指示符来告诉我先前的记录是否与当前的记录在同一天发生。现在,如果它们发生在同一天,我想计算从上一个记录到当前记录的时间差。我使用以下SQL并收到错误消息。

SELECT   
EQUIPMENTNUMBER,   
[TimeOfDay],   
Month,  
WeekNumber,  
Day,    
Year,  
CASE  
  WHEN Day = lag(day,1,0) over (order by CEID, YEAR, WeekNumber, DAY,timeofday)   
THEN
    datediff(minute, lag(timeofday,1,0) over (order by CEID, YEAR, WeekNumber, DAY,timeofday), timeofday)
    ELSE 0 
END 
FROM [Table] 

我收到以下错误:

Msg 206, Level 16, State 2, Line 26
Operand type clash: int is incompatible with time

有人可以详细说明此错误的含义或提供有关如何计算SQL Server中后续记录之间的时间戳差异的建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

lag(timeofday,1,0)是导致类型冲突的部分。 timeofday的类型为time,并且lag函数的默认默认值为int。这些应该是相同的。删除可选的默认值或更改为时间类型“ 00:00:00.000”

LAG(标量表达式[,offset] [,默认])
    OVER([[partition_by_clause] order_by_clause)