web-dev-qa-db-de.com

Berechnen, wie viele Tage in DB2 zwischen zwei Datumsangaben liegen?

Ich muss die Differenz zwischen zwei Datumsangaben in DB2 in Tagen berechnen. Ich habe ein paar verschiedene Abfragen ausprobiert, aber nichts scheint zu funktionieren. Im Grunde ist das, was ich brauche, so etwas.

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

Ich weiß, dass es funktioniert, wenn ich CHDLM entferne und ein Datum wie '2012-02-20' angreife, aber ich muss in der Lage sein, dies gegen dieses Feld in der Tabelle auszuführen. Ich versuche auch diese Abfrage, die mir ein Freund von mir gegeben hat, funktioniert nicht.

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

Bitte wird jede Hilfe sehr dankbar sein. Vielen Dank

9
jorame

Ich denke, dass @Siva auf dem richtigen Weg ist (mit DAYS()), aber die verschachtelten CONCAT()s machen mich schwindelig. Hier ist mein Take.
Oh, es hat keinen Sinn, auf sysdummy1 zu verweisen, da Sie trotzdem aus einer Tabelle ziehen müssen.
Verwenden Sie auch nicht die implizite Join-Syntax. Sie wird als SQL-Anti-Pattern betrachtet.

Ich habe die Datumsumwandlung hier aus Gründen der besseren Lesbarkeit in einen CTE verpackt, aber es gibt nichts, was Sie daran hindert, es inline zu machen.

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
10
Clockwork-Muse

Ich hatte das gleiche Problem in der eingebetteten IBM DB2 DB2-Datenbank in einer Java-Desktopanwendung, und nach einem Tag der Suche habe ich endlich herausgefunden, wie es gemacht wird:

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

weitere Informationen Diese Website besuchen

3
E_X
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

---------- BEARBEITEN VON galador

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

EDIT

Wie von X-Zero darauf hingewiesen, gibt diese Funktion nur eine Schätzung zurück. Das ist wahr. Für genaue Ergebnisse würde ich Folgendes verwenden, um die Differenz zwischen zwei Datumsangaben a und b zu berechnen:

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

Anscheinend fehlt bei ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, eine schließende Klammer.

So wird Ihre Anfrage sein 

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
Siva Charan

Wäre es nicht einfach so:

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

Dies sollte die Anzahl der Tage zwischen den beiden Datumsangaben zurückgeben, wenn ich die Funktionsweise der Datumsberechnung in DB2 richtig verstanden habe.

Wenn CHDLM kein Datum ist, müssen Sie es in ein Datum konvertieren. Laut IBM wäre die DATE () - Funktion für das Format yyyymmdd nicht ausreichend, würde jedoch funktionieren, wenn Sie das Format folgendermaßen formatieren können: yyyy-mm-dd.

0
David Faber