2015-01-30 4 views
-1

У меня есть таблица со списком меток времени, и я хочу, чтобы вычислить длительность между временными метками Список Таблица выглядит следующим образомКак рассчитать длительность между списком меток времени

 
MYTIME 
2015-01-30-08.12.51.141000 
2015-01-30-08.12.51.142000 
2015-01-30-08.12.51.142000 
2015-01-30-08.12.51.162000 
2015-01-30-08.12.51.170000 
2015-01-30-08.12.51.290000 

, что я хочу, как набор результатов

 
first timestamp next timestamp duration in microseconds 
2015-01-30-08.12.51.141000 2015-01-30-08.12.51.142000 1000 
2015-01-30-08.12.51.142000 2015-01-30-08.12.51.142000 0000 
2015-01-30-08.12.51.142000 2015-01-30-08.12.51.162000 20000 

Я использую DB2 для SQL я, но не знаю, как сделать это с поворотным столом или КТР?

+0

включить что-нибудь, код, запрос, схему таблиц, ввод образца, ожидаемый результат – HaveNoDisplayName

+0

Я знаю, как рассчитать продолжительность между двумя временными отметками. Я не знаю, как прокрутить список и рассчитать продолжительность. – user1500144

+1

Используйте ROW_NUMBER(), вы должны создать из в этом списке перечислены две таблицы и сделайте соединение. –

ответ

0

Вот мое решение DB2: У меня есть таблица с одним столбцом, заполненным тегами и метками времени; Сначала я создал CTE для фильтрации записей, которые я хотел, тогда я вытащил теги и временные метки и недавно созданный столбец ранга. Затем с этой таблицей CTE я использовал ранг, чтобы присоединиться к 1 к 2, а затем от 2 до 3 и т. Д., Чтобы получить мою продолжительность. * Спасибо Милану за то, что он направил меня в правильном направлении.

С TagTimeTable (MyTag, Mytime, myRank) в качестве (Выбрать подстроку (SPOOLRCD ИЗ 34 ДЛЯ 6), как MyTag, CAST (подстроку (SPOOLRCD ОТ 60 для 26) AS TIMESTAMP) А.С. MyTime, ROW_NUMBER() OVER (ORDER пО подстроку (SPOOLRCD от 60 за 26)), как myrank оТ MYLIB.SPOOLTBL ГДЕ SPOOLRCD LIKE '% воспр%' заказ по MyTime )

SELECT CAST ('0001-01-01 00: 00: 00.000 'как временная метка) + TIMESTAMPDIFF (1, CHAR (time2.myTime - time1.myTime)) MICROSECOND as TIME_IN_MICROSECONDS, TIME1.MYTIME, TIME2.MYTIME FROM TagTimeTable TIME1 INNER JOIN TagTimeTable TIME2 ON (TIME1.myRank = TIME2.myRank-1);

0

У меня нет базы данных DB2, но знаю, что DB2 также имеет функцию ROW_NUMBER(). Таким образом, вы можете попробовать применить следующий подход ... (он работает на MS SQL)

CREATE TABLE #temp (dt datetime); 

INSERT INTO #temp 
SELECT getutcdate() 
UNION ALL 
SELECT dateadd(ms, 7, getutcdate()) 
UNION ALL 
SELECT dateadd(s, 1, getutcdate()) 
UNION ALL 
SELECT dateadd(s, 3, getutcdate()); 

SELECT t1.dt as datetime1, t2.dt as datetime2, DATEDIFF(ms, t1.dt, t2.dt) as diff 
FROM (SELECT dt, ROW_NUMBER() OVER(ORDER BY dt)+1 as rn FROM #temp) t1 
INNER JOIN (SELECT dt, ROW_NUMBER() OVER(ORDER BY dt) as rn FROM #temp) t2 
ON t1.rn = t2.rn 

DROP TABLE #temp; 

Результат:

datetime1 datetime2 diff 
2015-01-30 20:57:59.053 2015-01-30 20:57:59.060 6 
2015-01-30 20:57:59.060 2015-01-30 20:58:00.053 993 
2015-01-30 20:58:00.053 2015-01-30 20:58:02.053 2000 
+0

Хорошо, это больше похоже на то, что я просто создаю CTE вместо таблицы temp, позвольте мне закодировать его и посмотреть, является ли это решением. – user1500144

1

Это зависит, какой сервер SQL вы используете. Выполняет ли это функции окна или нет?

Это будет операция между строками. Разница между предыдущими и следующими временными метками.

В MS SQL 2008:

WITH AUXILIERY_TBL AS (
    SELECT 
     A.[Time_Stamp] 
    ,ROW_NUMBER() OVER (ORDER BY A.[Time_Stamp]) AS Ordr 
     FROM [Time_Stamps_TBL] AS A 
) 

SELECT 
A.[Time_Stamp] 
,DATEDIFF(MINUTE ,B.[Time_Stamp] ,A.[Time_Stamp]) AS Duration_Minutes 
FROM AUXILIERY_TBL AS A 
LEFT JOIN AUXILIERY_TBL AS B 
     ON (A.Ordr=(B.Ordr+1)) 

В MS SQL 2012/14 было бы гораздо проще, без необходимости временной таблицы:

SELECT 
A.[Time_Stamp] 
,DATEDIFF(MINUTE, (LAG(A.[Time_Stamp]) OVER (ORDER BY A.[Time_Stamp])), A.[Time_Stamp]) AS Duration_Minutes 
FROM [Time_Stamps_TBL] AS A 

Вы можете изменить DATEDIFF функцию от нескольких минут до нескольких часов или секунд, что вам лучше.

+0

DB2 for i server не MS SQL ... но вы также можете быть в курсе с CTE – user1500144

+0

Да, это не так :) Я начинаю отвечать на вас, прежде чем вы отредактируете свой пост. В DB2 должна быть реализована функция ROW_NUMBER(). Я предполагаю, что решение будет аналогично решению 2008 года. Первая временная таблица для указания временных меток с номером строки, затем присоединитесь к ней с помощью A.Ordr = (B.Ordr + 1) –