Je dois obtenir la différence en jours entre deux dates dans DB2. J'ai essayé plusieurs requêtes mais rien ne semble fonctionner. Donc, fondamentalement, ce dont j'ai besoin, c'est quelque chose comme ça.
SELECT DAYS (CURRENT DATE) - DAYS (DATE(CHDLM)) FROM CHCART00 WHERE CHSTAT = '05';
Je sais que si je supprime CHDLM et spécifie une date telle que "2012-02-20", cela fonctionne, mais je dois pouvoir l'exécuter sur ce champ de la table. J'essaie aussi cette requête qui m'a été donnée par un ami par ne fonctionne pas non plus.
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';
S'il vous plaît, toute aide sera grandement apprécier. Merci
Je pense que @Siva est sur la bonne voie (avec DAYS()
), mais les CONCAT()
s imbriquées me donnent le vertige. Voici ma prise.
Oh, inutile de référencer sysdummy1
, vous devez extraire une table quand même.
De plus, n'utilisez pas la syntaxe de jointure implicite - elle est considérée comme un anti-modèle SQL.
Je vais insérer la conversion de date dans un CTE pour plus de lisibilité, mais rien ne vous empêche de le faire en ligne.
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
J'ai rencontré le même problème dans la base de données intégrée IBM DB2 de Derby dans une application de bureau Java, et après une journée de recherche, j'ai finalement trouvé comment procéder:
SELECT days (table1.datecolomn) - days (current date) FROM table1 WHERE days (table1.datecolomn) - days (current date) > 5
pour plus d'informations consultez ce site
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'
MODIFIER
Comme l'a souligné X-Zero, cette fonction ne renvoie qu'une estimation. C'est vrai. Pour obtenir des résultats précis, j’utiliserais ce qui suit pour obtenir la différence en jours entre deux dates a et b:
SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')))
FROM CHCART00
WHERE CHSTAT = '05';
Il semble qu’il manque une attelle de fermeture à ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,
Donc, votre requête sera
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';
Ne serait-ce pas juste:
SELECT CURRENT_DATE - CHDLM FROM CHCART00 WHERE CHSTAT = '05';
Cela devrait renvoyer le nombre de jours entre les deux dates, si j'ai bien compris comment l'arithmétique des dates fonctionne correctement dans DB2.
Si CHDLM n'est pas une date, vous devrez le convertir en un. Selon IBM, la fonction DATE () ne serait pas suffisante pour le format aaaammjj, mais elle fonctionnerait si vous pouviez formater comme ceci: aaaa-mm-jj.