Lorsque vous ajoutez ou soustrayez des horodatages, le résultat est un intervalle
, pas un autre horodatage. Vous pouvez utiliser l'extract
fonction
pour en extraire les composants. Si votre valeur est toujours inférieure à la seconde, vous pouvez simplement extraire les secondes et multiplier par mille pour obtenir les millisecondes :
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
Ici, votre vraie requête remplacerait le CTE factice que j'ai utilisé avec un littéral d'intervalle.
Si l'intervalle peut être supérieur à une seconde, vous voudrez probablement obtenir la valeur entière en millisecondes, vous devrez donc extraire tous les éléments et les additionner, en multipliant chacun en fonction de ce qu'ils représentent - donc une journée complète serait être 86400000 millisecondes etc. ; les éléments simples sortiraient comme :
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
Et vous les combineriez comme :
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
Mais sur la base de votre question précédente, vous le souhaitez peut-être sous forme de chaîne, en tant que composants séparés :
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 en fonction de vos données d'échantillon, en quelque sorte, et avec le calcul du temps inversé afin que la valeur soit positive.