@FergAp

Как можно вывести интервал по времени в данном наборе данных?

Таблица с набором данных:
(Tag NVARCHAR(60), [DateTime] datetime)
diag_TCC.tag	2020-06-01 09:16:18.963
diag_TCC.tag	2020-06-03 16:01:03.810
diag_TCC.tag	2020-06-03 16:02:00.843
diag_TCC.tag	2020-06-03 16:03:00.813
diag_TCC.tag	2020-06-03 16:04:00.813
diag_TCC.tag	2020-06-03 16:05:00.817
diag_TCC.tag	2020-06-03 16:06:00.880
diag_TCC.tag	2020-06-03 16:07:00.823
diag_TCC.tag	2020-06-05 15:02:49.247

Как вывести интервал, чтобы получилось:
(Tag NVARCHAR(60), [StartTime] datetime,            [EndTime] datetime)
diag_TCC.tag             2020-06-03 16:01:03.810     2020-06-03 16:07:00.823
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
С учётом уточнения интерпретации данных, а также допуская что метки только последовательно добавляются, предлагаю использовать триггер на добавление. Создаёте таблицу периодов.
(Tag NVARCHAR(60), [StartTime] datetime, [EndTime] datetime)
В триггере: если метка более 2-х минут от предыдущей (определяется легко: последняя - 1), то добавляем строку и заносим в StartTime, если нет — то в EndTime.

Или процедура:
CREATE PROCEDURE DowntimeCalculatePeriod
AS
  DECLARE @P TABLE ( ID INT IDENTITY, 
                     [Tag] NVARCHAR(60), [StartTime] DATETIME, [EndTime] DATETIME)
  DECLARE @DG1 NVARCHAR(60), @DT1 DATETIME
  DECLARE @DG0 NVARCHAR(60) = CHAR(0x19), @DT0 DATETIME = '2020'
  DECLARE @ID INT = -1
  DECLARE DowntimeCalc CURSOR FOR
    SELECT Tag, [DateTime] FROM Downtime ORDER BY 1, 2
  OPEN DowntimeCalc
  FETCH NEXT FROM DowntimeCalc INTO @DG1, @DT1
  WHILE @@FETCH_STATUS = 0 BEGIN
    IF ( @DG1 <> @DG0 ) OR (( @DG1 = @DG0 ) AND ( DATEDIFF( ss, @DT0, @DT1) > 90 )) BEGIN
      INSERT INTO @P ([Tag], [StartTime]) VALUES ( @DG1, @DT1 )
      SET @ID = SCOPE_IDENTITY()
    END ELSE BEGIN
      UPDATE @P SET [EndTime] = @DT1 WHERE ID = @ID
    END
    SET @DG0 = @DG1; SET @DT0 = @DT1
    FETCH NEXT FROM DowntimeCalc INTO @DG1, @DT1
  END
  CLOSE DowntimeCalc
  DEALLOCATE DowntimeCalc
  SELECT [Tag], [StartTime], [EndTime] FROM @P 
    WHERE NOT [EndTime] IS NULL 
    ORDER BY 1, 2
GO
--
EXECUTE DowntimeCalculatePeriod
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы