Wenn Sie Zeitstempel addieren oder subtrahieren, ist das Ergebnis ein Intervall
, kein anderer Zeitstempel. Sie können den Extrakt
Funktion
um die Komponenten daraus zu ziehen. Wenn Ihr Wert immer Subsekunden sein soll, können Sie einfach die Sekunden extrahieren und mit tausend multiplizieren, um die Millisekunden zu erhalten:
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 würde Ihre echte Abfrage den Platz des Dummy-CTE einnehmen, den ich mit einem Intervallliteral verwendet habe.
Wenn das Intervall länger als eine Sekunde sein könnte, möchten Sie vermutlich den gesamten Wert in Millisekunden erhalten, also müssten Sie alle Elemente extrahieren und addieren und jedes basierend auf dem, was sie darstellen, multiplizieren - also ein ganzer Tag 86400000 Millisekunden usw. sein; die einfachen Elemente würden wie folgt aussehen:
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
Und Sie würden sie wie folgt kombinieren:
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
Aber basierend auf Ihrer vorherigen Frage möchten Sie es vielleicht als Zeichenfolge, als separate Komponenten:
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-Geige basierend auf Ihren Beispieldaten, sozusagen und mit umgekehrter Zeitberechnung, sodass der Wert positiv ist.