Wanneer u tijdstempels toevoegt of aftrekt, is het resultaat een interval
, geen andere tijdstempel. U kunt het uittreksel
functie
om daar de componenten uit te halen. Als je waarde altijd sub-seconde zal zijn, kun je gewoon de seconden extraheren en vermenigvuldigen met duizend om de milliseconden te krijgen:
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
Hier zou je echte zoekopdracht de plaats innemen van de dummy CTE die ik gebruikte met een letterlijke interval.
Als het interval meer dan een seconde zou kunnen zijn, zou je vermoedelijk de volledige waarde in milliseconden willen krijgen, dus je zou alle elementen moeten extraheren en ze bij elkaar optellen, elk vermenigvuldigd op basis van wat ze vertegenwoordigen - dus een volledige dag zou 86400000 milliseconden enz. zijn; de gewone elementen zouden eruit komen als:
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
En je zou ze combineren als:
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
Maar op basis van je vorige vraag, wil je het misschien als een string, als de afzonderlijke componenten:
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 gebaseerd op uw voorbeeldgegevens, een soort van, en met de tijdberekening omgekeerd, zodat de waarde positief is.