sql >> Base de Datos >  >> RDS >> Oracle

Convierta los datos de la columna de diferencia TIMESTAMP a formato de cadena

Cuando agrega o resta marcas de tiempo, el resultado es un intervalo , no otra marca de tiempo. Puede usar el extract función para sacar los componentes de eso. Si su valor siempre va a ser subsegundo, puede simplemente extraer los segundos y multiplicar por mil para obtener los milisegundos:

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 

Aquí su consulta real tomaría el lugar del CTE ficticio que usé con un intervalo literal.

Si el intervalo puede ser más de un segundo, probablemente querrá obtener el valor total en milisegundos, por lo que necesitará extraer todos los elementos y sumarlos, multiplicando cada uno según lo que representan, por lo que un día completo sería ser 86400000 milisegundos, etc.; los elementos planos saldrían como:

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 

Y los combinarías como:

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 

Pero según su pregunta anterior, tal vez lo quiera como una cadena, como componentes separados:

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 basado en sus datos de muestra, más o menos, y con el cálculo del tiempo invertido para que el valor sea positivo.