Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Konwertuj dane kolumny różnicy TIMESTAMP na format ciągu znaków

Podczas dodawania lub odejmowania znaczników czasu wynikiem jest interwał , a nie inny znacznik czasu. Możesz użyć extract funkcja aby wyciągnąć z tego komponenty. Jeśli wartość ma zawsze wynosić poniżej sekundy, możesz po prostu wyodrębnić sekundy i pomnożyć przez tysiąc, aby uzyskać milisekundy:

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 

Tutaj twoje prawdziwe zapytanie zajęłoby miejsce fikcyjnego CTE, którego użyłem z literałem interwałowym.

Jeśli interwał może być dłuższy niż sekunda, prawdopodobnie chciałbyś uzyskać całą wartość w milisekundach, więc musiałbyś wyodrębnić wszystkie elementy i dodać je do siebie, mnożąc każdy na podstawie tego, co reprezentują – więc cały dzień byłby być 86400000 milisekund itd.; zwykłe elementy wyjdą jak:

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 

I można je połączyć w następujący sposób:

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 

Ale w oparciu o twoje poprzednie pytanie, być może chcesz go jako ciąg, jako oddzielne komponenty:

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

Skrzypce SQL na podstawie twoich przykładowych danych, rodzaju i z odwróconym obliczeniem czasu, więc wartość jest dodatnia.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica między dwiema wartościami Rok Miesiąc i Dzień w Oracle

  2. Tabela zapytań z innej bazy danych ORACLE

  3. Wyzwalacz Oracle SQL podczas aktualizacji kolumny

  4. Różnice między MySQL a Oracle DB

  5. -bash:imp:polecenie nie zostało znalezione wyrocznia