Вычислить разницу во времени между двумя последовательными строками

#sql #datediff

#sql #datediff

Вопрос:

У меня есть такая таблица:

 RecordID     TransDate
1            05-Oct-16 9:33:32 AM
2            05-Oct-16 9:33:37 AM
3            05-Oct-16 9:33:41 AM
4            05-Oct-16 9:33:46 AM
5            05-Oct-16 9:33:46 AM
  

Мне нужно получить разницу между последовательными TransDate значениями. Я использую SQL Server 2014 и знаю, как использовать для этого функции ЗАДЕРЖКИ, но я не знаю, как это сделать.

Мне нужен этот вывод:

 RecordID     TransDate              Diff
1            05-Oct-16 9:33:32 AM   0:00:00
2            05-Oct-16 9:33:37 AM   0:00:05
3            05-Oct-16 9:33:41 AM   0:00:04
4            05-Oct-16 9:33:46 AM   0:00:05
5            05-Oct-16 9:33:46 AM   0:00:00
  

Есть идеи?

Заранее спасибо!

Ответ №1:

Как насчет этого:

 select recordid, transdate,
       cast( (transdate - lag(transdate) over (order by transdate)) as time) as diff
from t;
  

Другими словами, вы можете вычесть два datetime значения и привести результат как время. Затем вы можете отформатировать результат, как вам нравится.

Комментарии:

1. Элегантный, простой и эффективный. Спасибо! Мне придется изучить эти функции задержки, похоже, теперь я буду использовать их чаще.

Ответ №2:

Подход без задержки / опережения…

 select T1.recordId, T1.TransDate, datediff(ss, T1.TransDate, T2.Transdate) as Diff
from Table1 T1
left join Table1 T2
on T1.Recordid = T2.RecordId  1
  

Ответ №3:

Может быть, немного хакерски:

 SELECT RecordId / 2 AS id, min(TransDate) AS TransDate, max(TransDate) - min(TransDate) AS Diff GROUP BY RecordId / 2
  

Непроверенный, потому что у меня сейчас нет SQL Server.

Ответ №4:

Попытался создать курсор, чтобы получить разницу в дате.

 --- Query to get date difference between two rows 

declare @table table (olddate datetime, newdate datetime)
create table #table (olddate datetime, newdate datetime)

DECLARE db_cursor CURSOR FOR 

  SELECT  CONVERT(date,[utl_recycle_date] ) as RecycleDate
  FROM XYZ
  WHERE account_number = '6900' AND match_status = 'F' 
  AND [utl_recycle_date] IS NOT NULL
  AND [utl_recycle_date] > '11/01/2018'
  GROUP BY DATEDIFF(DAY, CONVERT(date,[utl_recycle_date] ), CONVERT(date, GETDATE())),CONVERT(date,[utl_recycle_date] )
  ORDER BY 1

DECLARE @RecycleDate datetime 
DECLARE @NewDate datetime 

OPEN db_cursor 

FETCH next FROM db_cursor INTO @RecycleDate 

WHILE @@FETCH_STATUS = 0 
  BEGIN 

      FETCH next FROM db_cursor INTO @NewDate

      insert INTO #table (olddate, newdate) values (cast(@RecycleDate as date), cast(@NewDate as date))
      set @RecycleDate = @NewDate

  END 

CLOSE db_cursor 

DEALLOCATE db_cursor 

select 
olddate, newdate,
CASE 
  WHEN DATEDIFF(DAY, olddate, newdate) = 0 THEN 1 
  WHEN DATEDIFF(DAY, olddate, newdate) > 0 THEN DATEDIFF(DAY, olddate, newdate)
  END AS RecyclerFrequency  

FROM #table

drop table #table