Cuando agrega o resta marcas de tiempo, el resultado es un intervalo
, no otra marca de tiempo. Puede usar el extract
función
para sacar los componentes de eso. Si su valor siempre va a ser subsegundo, puede simplemente extraer los segundos y multiplicar por mil para obtener los milisegundos:
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
Aquí su consulta real tomaría el lugar del CTE ficticio que usé con un intervalo literal.
Si el intervalo puede ser más de un segundo, probablemente querrá obtener el valor total en milisegundos, por lo que necesitará extraer todos los elementos y sumarlos, multiplicando cada uno según lo que representan, por lo que un día completo sería ser 86400000 milisegundos, etc.; los elementos planos saldrían como:
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
Y los combinarías como:
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
Pero según su pregunta anterior, tal vez lo quiera como una cadena, como componentes separados:
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 basado en sus datos de muestra, más o menos, y con el cálculo del tiempo invertido para que el valor sea positivo.