-
Comparaison de dates
Bonjour à tous,
je suis occupé à implémenter un programme java devant comparer deux dates dans une base de données.
Le problème que je rencontre est que les dates stockées en DB le sont sous la forme d'un DECIMAL. On trouve ainsi : 20120403 pour la date d'aujourdhui.
J'aimerai pouvoir comparer une date entrée par l'utilisateur pour récupérer tous les objets ayant une date inférieure à celle entrée.
J'ai vu qu'il existe des fonctions de formattages mais je ne sais pas laquelle choisir, et quel tag utiliser pour spécifier mon formatage en DB.
J'aimerai utiliser quelque chose du genre :
Code:
WHERE format(champ_date_db) <= format('20120403')
pour récupérer les objets ayant une date inférieure à la date d'aujourd'hui (03/04/2012)
Merci d'avance
-
Bonjour,
Le format de ta date n'est pas en décimal ici mais sous la forme YYYYMMDD.
Si tu veux la formater autrement utilise TO_CHAR.
-
Bonjour et merci.
Quand je vais voir dans la définiton de ma table, le DATA_TYPE m'indique NUMBER(0,8), il n'aurait pas du m'indiquer DATE alors?
Si vraiment il s'agit alors d'une date, puis-je utiliser directement les opérateurs de comparaisons pour comparer alors mes dates?
Code:
WHERE champ_date_db <= 20120403
Le problème est que mon entrée 20120403 sera sous la forme d'une chaine de caractères dans mn programme, je supose que je dois donc la convertir en date?
-
-
-
En pratique, c'est pas stocke comme une date en base. Vous ne pouvez donc pas facilement changer l'affichage, recuperer simplement le jour, etc. Et vous pouvez mettre le 41 janvier 2012 ou le 13 du mois numero 42 de l'an 2012. :roll:
Mais techniquement, comme c'est au format YYYYMMDD vous pouvez faire vos comparaisons directement.
Le 21 Mars 2010 est situe avant le 29 Fevrier 2012:
20100321<20120229
-
Il faut d'abord convertir votre nombre en chaîne puis en date pour le comparer à la date du jour :
Code:
WHERE to_date(to_char(champ_date_db), 'yyyymmdd') <= sysdate;
-
pas d'accord avec Waldar sur la conversion. Mieux vaut la faire côté paramètre que côté colonne de table.
Code:
WHERE champ_date_db <= to_number(to_char(sysdate,'yyyymmdd'))
-
En général c'est vrai.
Mais quand c'est mal codé, on peut torturer le problème dans tous les sens, ça reste mal codé.
Garbage in, garbage out comme disent les anglophones.
Le jour où il voudra effectuer des opérations de date sur sa colonne la solution ne fonctionnera plus.
Le jour où les données seront corrompues (20120230 par exemple) personne ne s'en rendra compte.
D'ailleurs nddvlp avez-vous la possibilité de modifier la base de données pour corriger ce problème ? C'est de loin la meilleure solution.