sql >> Database >  >> RDS >> Oracle

Converteer TIMESTAMP-verschilkolomgegevens naar tekenreeksindeling

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.




  1. #1054 onbekende kolom in op clausule fout

  2. Slaapstand meerdere rijen invoegen postgresql

  3. Kan MySQL strings samenvoegen met ||

  4. Hoe verander ik de labeltekst van de drukknop en voeg ik een nieuwe functionaliteit toe tijdens runtime? Oracle-formulieren