Oracle
 sql >> база данни >  >> RDS >> Oracle

Преобразувайте данните от колоната за разлика TIMESTAMP във формат на низ

Когато добавяте или изваждате времеви отпечатъци, резултатът е интервал , а не друго времево клеймо. Можете да използвате extract функция да извадя компонентите от това. Ако стойността ви винаги ще бъде подсекунда, можете просто да извлечете секундите и да умножите по хиляда, за да получите милисекундите:

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 

Тук истинската ви заявка ще заеме мястото на фиктивния CTE, който използвах с интервален литерал.

Ако интервалът може да е повече от секунда, тогава вероятно бихте искали да получите цялата стойност в милисекунди, така че ще трябва да извлечете всички елементи и да ги добавите заедно, като умножите всеки въз основа на това, което представляват - така че цял ден би бъде 86400000 милисекунди и т.н.; обикновените елементи биха излезли като:

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 

И бихте ги комбинирали така:

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 

Но въз основа на предишния ви въпрос, може би го искате като низ, като отделните компоненти:

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 въз основа на вашите примерни данни, нещо като, и с обърнато изчисление на времето, така че стойността е положителна.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Поправете „Не може да се инсталира в Homebrew на ARM процесор в префикс по подразбиране на Intel (/usr/local)!“

  2. Oracle Identify Data Type

  3. изберете rownum от заплата, където rownum=3;

  4. Как да извлека BLOB данни от Oracle Client с помощта на Oledb драйвер във Vb.Net?

  5. PL/SQL извлича имената на колоните на оператора SELECT от потребителска заявка