Преобразование данных столбца разности TIMESTAMP в строковый формат

По моему мнению, я получаю столбец со значением '0 0:0:0.343009' который показывает разницу между двумя временными '0 0:0:0.343009' , точностью до миллисекунды.

Я хотел бы показать их как строку, например, 343 миллисекунды или другое значение, но должен быть миллисекундным преобразованием.

У меня была аналогичная запись в прошлом, но этот столбец времени был DATE данных DATE , и на этот раз это TIMESTAMP . Я использую функцию FLOOR чтобы изменить вывод на числовое значение, чтобы показать более удобный результат.

Я использовал образец запроса, чтобы найти разницу дат. Здесь created_time – тип данных TIMESTAMP :

 select msg_guid, (max(case when payload_type = 1 then created_time end) - (case when max(case when payload_type = 2 then created_time end) <> trunc(max(case when payload_type = 2 then created_time end)) then max(case when payload_type = 2 then created_time end) when max(case when payload_type = 3 then created_time end) <> trunc(max(case when payload_type = 3 then created_time end)) then max(case when payload_type = 3 then created_time end) end) ) as diff from table t group by msg_guid; 

Когда вы добавляете или вычитаете временные метки, результатом является интервал , а не другая временная метка. Вы можете использовать функцию extract чтобы вытащить компоненты из этого. Если вы цените, всегда будет суб-секунда, вы можете просто извлечь секунды и умножить на тысячу, чтобы получить миллисекунды:

 with t as ( select 1 as msg_guid, interval '0 0:0:0.343009' day to second as diff from dual ) select trunc(extract (second from diff) * 1000) from t; TRUNC(EXTRACT(SECONDFROMDIFF)*1000) ----------------------------------- 343 

Здесь ваш реальный запрос займет место фиктивного CTE, который я использовал с интервальным литералом.

Если интервал может быть более секунды, вы, вероятно, хотите получить все значение в миллисекундах, поэтому вам нужно будет извлечь все элементы и добавить их вместе, умножая их на то, что они представляют, поэтому полный день быть 86400000 миллисекунд и т. д .; простые элементы появлялись бы так:

 column diff format a25 with t as ( select 1 as msg_guid, systimestamp - trunc(systimestamp) as diff from dual ) select diff, extract (day from diff) as dd, extract (hour from diff) as hh, extract (minute from diff) as mi, extract (second from diff) as ss from t; DIFF DD HH MI SS ---------------------- ---------- ---------- ---------- ---------- 0 9:13:26.150627 0 9 13 26.150627 

И вы объедините их так:

 with t as ( select 1 as msg_guid, systimestamp - trunc(systimestamp) as diff from dual ) select diff, trunc(1000 * ( extract (day from diff) * (60*60*24) + extract (hour from diff) * (60*60) + extract (minute from diff) * 60 + extract (second from diff) )) as milliseconds from t; DIFF MILLISECONDS ---------------------- ------------ 0 9:13:27.650365 33207650 

Но, основываясь на вашем предыдущем вопросе, возможно, вы хотите, чтобы это как строка, как отдельные компоненты:

 with t as ( select 1 as msg_guid, systimestamp - trunc(systimestamp) as diff from dual ) select diff, extract (day from diff) || ' DAYS ' || extract (hour from diff) || ' HOURS ' || extract (minute from diff) || ' MINUTES ' || trunc(extract (second from diff)) || ' SECONDS ' || (trunc(extract (second from diff) * 1000) - (trunc(extract (second from diff)) * 1000)) || ' MILLISECONDS' as text from t; DIFF TEXT ---------------------- ------------------------------------------------------- 0 9:43:38.896007 0 DAYS 9 HOURS 43 MINUTES 38 SECONDS 896 MILLISECONDS 

SQL Fiddle на основе ваших выборочных данных, сорта и с изменением времени, чтобы значение было положительным.