Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Konvertieren Sie die Daten der TIMESTAMP-Differenzspalte in das Zeichenfolgenformat

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.