Когато добавяте или изваждате времеви отпечатъци, резултатът е интервал
, а не друго времево клеймо. Можете да използвате 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 въз основа на вашите примерни данни, нещо като, и с обърнато изчисление на времето, така че стойността е положителна.