SQL - Ayuda resta campos fecha

 
Vista:
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Ayuda resta campos fecha

Publicado por Ale (11 intervenciones) el 07/12/2017 19:37:33
Buenas a todos, necesito una ayudita, tengo que hacer un select de dos campos con el mismo tamaño y formato STRING que en el fondo son fechas, necesito sacar la resta para ver los tiempos que tardo en responder, el problema que una resta de fechas STRING no hace bien el cálculo, os adjunto la foto donde lo he explicado a mano que creo que se entiende mejor.

Estoy usando SQLPLUS con ORACLE.

Cualquier duda que tengais decirme para ver si me podeis ayudar, como siempre, muchas gracias a todos!!.

Saludos.

IMG_20171207_123033_520
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda resta campos fecha

Publicado por leonardo_josue (1173 intervenciones) el 07/12/2017 20:30:50
Hola Ale:

En realidad tienes muchas formas de hacer esto, el detalle está en que no es lo mismo restar cadenas a restar números a restar fechas. De hecho, el que estés guardando las horas como STRING, es un error de diseño. Es una muy mala práctica, si vas a almacenar fechas u horas, entonces tu campo debe ser DATE o TIMESTAMP... su puedes cambiar tu tabla, hazlo y evita dolores de cabeza, pero si no te es posible cambiar el tipo de dato de tu tabla, entonces puedes hacer lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
with rws as (
  select
    '230000' cadena1,
    '225900' cadena2
  from dual
), tstamps as (
  select
    cadena1,
    cadena2,
    to_timestamp(cadena1, 'hh24miss') hora1,
    to_timestamp(cadena2, 'hh24miss') hora2
  from rws
)
select
  cadena1,
  cadena2,
  hora1,
  hora2,
  extract(hour from (hora1-hora2)) hrs,
  extract(minute from (hora1-hora2)) mins,
  extract(second from (hora1-hora2)) secs,
  hora1-hora2 diff_interval
from tstamps;
 
+-------+-------+---------------------------+---------------------------+---+----+----+-------------------+
|CADENA1|CADENA2|HORA1                      |HORA2                      |HRS|MINS|SECS|DIFF_INTERVAL      |
+-------+-------+---------------------------+---------------------------+---+----+----+-------------------+
|230000 |225900 |01/12/17 23:00:00.000000000|01/12/17 22:59:00.000000000|0  |1   |0   |+00 00:01:00.000000|
+-------+-------+---------------------------+---------------------------+---+----+----+-------------------+

En realidad hay mucho código de relleno, la primer parte es sólo para poner los datos de ejemplo. El truco está en convertir primero tus cadenas originales a TIMESTAMP:

1
2
3
4
...
    to_timestamp(cadena1, 'hh24miss') hora1,
    to_timestamp(cadena2, 'hh24miss') hora2
...

al restar dos TIMESTAMP, entonces el resultado es un TIMESTAMP...

1
2
3
...
hora1-hora2 diff_interva
...

La parte de los EXTRACT es solo para separar en HORAS, MINUTOS y SEGUNDOS esta diferencia.

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Ayuda resta campos fecha

Publicado por Ale (11 intervenciones) el 07/12/2017 20:41:33
Bueno lo primero de todo darte las gracias por tu respuesta, estoy totalmente de acuerdo contigo que el diseño esta mal por tener un string donde debía ser un date, pero por desgracia no me es posible hacer esa modificación .

Ahora tengo un par de problemas más xD, el primero es que por desgracia no soy un experto en ORACLE, y el segundo es que el dato que recupero de la tabla tiene este formato: '20171231230010999', pregunta, ¿Con el timestamp puedo contemplar los milisegundos?¿Que formato tendría? Ejemplo: YYYYMMDDhhmmssxxx ?¿

De nuevo muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda resta campos fecha

Publicado por leonardo_josue (1173 intervenciones) el 07/12/2017 21:09:54
Hola de nuevo:

Siempre es recomendable que antes de publicar una pregunta, te comes un tiempo para preguntarle a SAN GOOGLE o revisar la documentación oficial para ver si encuentras la respuesta... en la mayoría de los casos, las respuestas están ahí, es simplemente cuestión de buscar un poco.

https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 20
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Ayuda resta campos fecha

Publicado por Ale (11 intervenciones) el 07/12/2017 22:23:07
Pues de nuevo gracias, y lo de buscar en google también lo hago pero no lo he encontrado, quizás por mi desconocimiento no se poner la pregunta adecuada en el buscador.

Bueno ya lo he conseguido y te estoy muy agradecido, pero para dejarlo perfecto, una última consulta, el resultado de mi resta es este:

TIEMPO_TOTAL
---------------------------------------------------------------------------
+000000000 00:00:00.351000000


¿Tengo manera de que mi resultado sea "solo" 350?, así quito todos los ceros.

Muchas gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar