Oracle
 sql >> Base de données >  >> RDS >> Oracle

Convertir les données de la colonne de différence TIMESTAMP au format chaîne

Lorsque vous ajoutez ou soustrayez des horodatages, le résultat est un intervalle , pas un autre horodatage. Vous pouvez utiliser l'extract fonction pour en extraire les composants. Si votre valeur est toujours inférieure à la seconde, vous pouvez simplement extraire les secondes et multiplier par mille pour obtenir les millisecondes :

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 

Ici, votre vraie requête remplacerait le CTE factice que j'ai utilisé avec un littéral d'intervalle.

Si l'intervalle peut être supérieur à une seconde, vous voudrez probablement obtenir la valeur entière en millisecondes, vous devrez donc extraire tous les éléments et les additionner, en multipliant chacun en fonction de ce qu'ils représentent - donc une journée complète serait être 86400000 millisecondes etc. ; les éléments simples sortiraient comme :

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 

Et vous les combineriez comme :

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 

Mais sur la base de votre question précédente, vous le souhaitez peut-être sous forme de chaîne, en tant que composants séparés :

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 en fonction de vos données d'échantillon, en quelque sorte, et avec le calcul du temps inversé afin que la valeur soit positive.