Calculando quantos dias estão entre duas datas em DB2?

Preciso da diferença de dias entre duas datas em DB2. Tentei algumas perguntas diferentes, mas nada parece estar a funcionar. Então, basicamente o que eu preciso é algo assim.

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

eu sei que se eu remover CHDLM e especificar uma data como '2012-02-20' ele funciona, mas eu preciso ser capaz de executar isso em campo na tabela. Eu também tento essa consulta que me foi dada por um amigo por não está funcionando.

 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, qualquer ajuda será muito grande. agradeço. Obrigado.
Author: jorame, 2012-03-02

5 answers

Eu acho que @Siva está no caminho certo (usando DAYS()), mas os aninhados CONCAT() estão me deixando tonto. Aqui está a minha parte.
Não vale a pena referenciares-te a uma mesa.
Além disso, não use a sintaxe de junção implícita - é considerado um Anti-padrão SQL.

Vou embrulhar a conversão de data num CTE para leitura aqui, mas não há nada que te impeça de o fazer em linha.
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
 9
Author: Clockwork-Muse, 2012-03-02 23:31:09

Eu enfrentei o mesmo problema no Derby IBM DB2 embedded database em uma aplicação de desktop java, e depois de um dia de pesquisa eu finalmente descobri como é feito:

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

Para mais informações Verifique este site

 3
Author: E_X, 2015-12-30 07:06:26
Parece que falta um aparelho de fecho em ... ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, Então a sua pergunta 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
Author: Siva Charan, 2012-03-02 18:58:06

Não seria apenas:

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

Isso deve devolver o número de dias entre as duas datas, Se eu entender como a aritmética de data funciona em DB2 corretamente.

Se o CHDLM não é um encontro, tens de O converter para um. De acordo com IBM, a função DATE() não seria suficiente para o formato AAAAMMDD, mas funcionaria se você pudesse formatar assim: AAAA-mm-dd.
 0
Author: David Faber, 2012-03-02 19:51:44
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

---------- edição de galador

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

Editar

Como foi assinalado por X-Zero, esta função devolve apenas uma estimativa. É verdade. Para obter resultados precisos, utilizaria o seguinte para obter a diferença de dias entre duas datas A e b:

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')))
FROM CHCART00 
WHERE CHSTAT = '05';
 0
Author: Isaac, 2012-03-03 09:29:17