2012-03-02 324 views
7

Necesito obtener la diferencia en días entre dos fechas en DB2. Intenté un par de consultas diferentes, pero parece que nada funciona. Entonces, básicamente, lo que necesito obtener es algo como esto.¿Cálculo de cuántos días hay entre dos fechas en DB2?

SELECT DAYS (CURRENT DATE) - DAYS (DATE(CHDLM)) FROM CHCART00 WHERE CHSTAT = '05'; 

sé que si me quito CHDLM y especificar una fecha como '2012-02-20' funciona, pero tengo que ser capaz de ejecutar esto en contra de ese campo en la tabla. También intento que esta consulta que me dio un amigo no esté funcionando tampoco.

select days (current date) - days (date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05'; 

Por favor, cualquier ayuda será muy apreciada. Gracias

+0

Parece que hay un problema con el tipo de datos de columna ... – Teja

Respuesta

8

Creo que @Siva está en el camino correcto (usando DAYS()), pero los CONCAT() s anidados me marean. Aquí está mi opinión.
Oh, no tiene sentido hacer referencia a sysdummy1, ya que debe extraer de una tabla independientemente.
Además, no utilice la sintaxis de unión implícita: se considera un antipatrón de SQL.

Voy a incluir la conversión de fecha en un CTE para la legibilidad aquí, pero no hay nada que le impida hacerlo en línea.

WITH Converted (convertedDate) as (SELECT DATE(SUBSTR(chdlm, 1, 4) || '-' || 
               SUBSTR(chdlm, 5, 2) || '-' ||  
               SUBSTR(chdlm, 7, 2)) 
            FROM Chcart00 
            WHERE chstat = '05') 

SELECT DAYS(CURRENT_DATE) - DAYS(convertedDate) 
FROM Converted 
+0

Gracias por eso mucho X-Zero, esto funciona muy bien. – jorame

+0

Lo siento, una pregunta más, ¿qué pasa si necesito seleccionar más campos de la tabla CHCART00, cómo puedo hacer eso? – jorame

+0

No importa, lo entiendo. Gracias – jorame

0
values timestampdiff (16, char( 
    timestamp(current timestamp + 1 year + 2 month - 3 day)- 
    timestamp(current timestamp))) 
1 
= 
422 



values timestampdiff (16, char( 
    timestamp('2012-03-08-00.00.00')- 
    timestamp('2011-12-08-00.00.00'))) 
1 
= 
90 

---------- de edición Galador

SELECT TIMESTAMPDIFF(16, CHAR(CURRENT TIMESTAMP - TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')) 
FROM CHCART00 
WHERE CHSTAT = '05' 

EDITAR

Como se ha señalado por X-Zero, esta función devuelve solo una estimación. Esto es verdad. Para obtener resultados precisos Me gustaría utilizar estos procedimientos para obtener la diferencia de días entre dos fechas a y b:

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD'))) 
FROM CHCART00 
WHERE CHSTAT = '05'; 
+0

¿Cómo puedo implementar esto en mi consulta? – jorame

+0

Agregué en una consulta que creo que debería conseguirte lo que quieres (suponiendo que 'CHDLM' es una fecha o tipo de marca de tiempo, o una cadena con el formato correcto). – bhamby

+0

CHDLM está formateado como aaaammdd, ¿cree que esta consulta funcionará con eso? – jorame

0

Parece que una llave de cierre no se encuentra en ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,

Así que la consulta será

select days(current date) - days(date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05'; 
+0

No funciona, recibo un "Token CONCAT no era válido. Fichas válidas: (," error. – jorame

0

no sería sólo:

SELECT CURRENT_DATE - CHDLM FROM CHCART00 WHERE CHSTAT = '05'; 

que debería r Establezca el número de días entre las dos fechas, si entiendo cómo funciona la aritmética de fecha en DB2 correctamente.

Si CHDLM no es una fecha, tendrá que convertirla a una. Según IBM, la función DATE() no sería suficiente para el formato aaaammdd, pero funcionaría si puede formatear así: aaaa-mm-dd.

+0

¿Alguna idea sobre cómo puedo formatear la fecha de esa manera? – jorame

+0

Desafortunadamente, los resultados de estas operaciones son un _período indefinido_ (es decir, 2 meses, 3 días), incluso cuando el formato inicial sea válido. El OP específicamente solicitó el número de días. –

+0

Ah, disculpas, deberían ser DAYS (CURRENT_DATE) - DAYS (CHDLM) –

2

que enfrentan el mismo problema en Derby IBM DB2 base de datos integrada en una aplicación de escritorio Java, y después de un día de reconocimiento Finalmente encontré cómo se hace:

SELECT days (table1.datecolomn) - days (current date) FROM table1 WHERE days (table1.datecolomn) - days (current date) > 5 

para más información check this site

+1

esto solo funcionaría si se sabe que las fechas siempre están en el mismo mes. ('day' simplemente devuelve el campo del día del mes) Usar' days' debería funcionar para los casos generales, ya que devuelve el número de da ys desde la época. –

Cuestiones relacionadas