2012-03-02 46 views
7

Ho bisogno di ottenere la differenza in giorni tra due date in DB2. Ho provato un paio di domande diverse ma nulla sembra funzionare. Quindi in pratica quello che ho bisogno di ottenere è qualcosa di simile.Calcolo quanti giorni sono tra due date in DB2?

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

So che se tolgo CHDLM e specificare una data come '2012-02-20' funziona, ma ho bisogno di essere in grado di eseguire questo contro quel campo nella tabella. Provo anche questa domanda che mi è stata data da un amico non funziona neanche.

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'; 

Per favore qualsiasi aiuto sarà molto apprezzato. Grazie

+0

Sembra che ci sia un problema con il tipo di dati della colonna ... – Teja

risposta

8

Penso che @Siva sia sulla strada giusta (utilizzando DAYS()), ma i nidificati CONCAT() s mi stanno facendo girare la testa. Ecco la mia versione.
Oh, non ha senso riferirsi allo sysdummy1, poiché è necessario tirare da una tabella.
Inoltre, non utilizzare la sintassi di join implicita: è considerato un Anti-pattern SQL.

Ho avvolto la conversione della data in un CTE per la leggibilità qui, ma non c'è nulla che ti impedisce di farlo in linea.

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

Grazie mille molto X-Zero, funziona benissimo – jorame

+0

Scusate, un'altra domanda, e se ho bisogno di selezionare più campi dalla tabella CHCART00, come posso fare? – jorame

+0

Non importa che lo capisco. Grazie – 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 

---------- EDIT BY galador

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

EDIT

Come è stato indicato da X-zero, questa funzione restituisce solo una stima. Questo è vero. Per ottenere risultati accurati Vorrei utilizzare il seguente per ottenere la differenza in giorni tra due date a e b:

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

In che modo posso implementare esattamente questo nella mia query? – jorame

+0

Ho aggiunto in una query che penso dovrebbe portarvi ciò che volete (assumendo che 'CHDLM' sia un tipo data o timestamp o una stringa formattata correttamente). – bhamby

+0

CHDLM è formattato come yyyymmdd, pensi che questa query possa funzionare? – jorame

0

Sembra che una coppia di chiusura manca a ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,

Così la vostra query sarà

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

Non funziona, sto ricevendo un "CONCAT Token non valido. Token validi: (," errore – jorame

0

non sarebbe solo essere:

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

Questo dovrebbe r eturn il numero di giorni tra le due date, se capisco come funziona l'aritmetica della data in DB2 correttamente.

Se CHDLM non è una data, è necessario convertirlo in uno. Secondo IBM, la funzione DATE() non sarebbe sufficiente per il formato yyyymmdd, ma funzionerebbe se fosse possibile formattare in questo modo: aaaa-mm-gg.

+0

Qualche idea su come posso formattare la data in quel modo ?? – jorame

+0

Sfortunatamente, i risultati di queste operazioni sono un periodo indefinito_ (vale a dire 2 mesi, 3 giorni), anche quando il formato di partenza è valido L'OP ha chiesto espressamente il numero di giorni –

+0

Ah, mi scuso, dovrebbe essere GIORNI (CURRENT_DATE) - DAYS (CHDLM) –

2

Ho affrontato lo stesso problema in Derby IBM DB2 database integrato in un'applicazione desktop Java, e dopo una giornata di ricerche ho finalmente trovato come si fa:

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

per ulteriori informazioni check this site

+1

questo funzionerebbe solo se le date sono note per essere sempre nello stesso mese. ('day' restituisce solo il campo giorno-mese) L'uso di' days' dovrebbe funzionare per i casi generali, poiché restituisce il numero di da Sì dall'epoca. –

Problemi correlati