Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
je souhaite faire un calcul de date avec cette requete
select * from equipements where date date_maintenance + periodicite unite_periode
between '05/10/2010' and '06/17/2010'
date_maintenance est une date
periodicite est un entier
unite_periode est une chaine (mois ou semaine)
merci pour votre aide
Hors ligne
Avant de commencer, une règle d'hygiène sur les dates : toujours les écrire au format ISO (2010-06-17). Celà vous évitera d'avoir des problèmes.
Ensuite, un second point :
ne jamais appliquer de fonction sur une colonne sur laquelle on applique une clause WHERE :
date_maintenance + periodicite unite_periode between '05/10/2010' and '06/17/2010'
applique une fonction sur date_maintenance, ce qui empêche d'utiliser un index dessus, et effectue un calcul pour chaque enregistrement rencontré. Il est préférable d'écrire :
date_maintenance between '05/10/2010' - periodicite unite_periode and '06/17/2010' - periodicite unite_periode
Cette version sera beaucoup plus performante.
Maintenant la solution :
select * from equipements where date date_maintenance
between '2010/10/05' - periodicite * '1 month'::interval and '2010/17/06' - periodicite * '1 month'::interval
Si la periodicite est jour, remplacer par day,week, etc. On peut même effectuer des opérations du genre 3 * '1 month 1 week 3 days'.
Marc.
Hors ligne
Merci pour votre précieuse,
la requete tel quelle me ramene une erreur.
select * from equipements where date date_maintenance
between '2010/10/05' - periodicite * '1 month'::interval and '2010/17/06' - periodicite * '1 month'::interval
ERREUR: erreur de syntaxe sur ou près de « date_maintenance »
LINE 1: select * from equipements where date date_maintenance
^
********** Erreur **********
ERREUR: erreur de syntaxe sur ou près de « date_maintenance »
État SQL :42601
Caractère : 38
dans l'urgence j'ai réussi à afficher quelque chose en faisant comme ceci.
select date_maintenance, periodicite from equipements where ot_encours = false
and date_maintenance + periodicite * '1 month'::interval
between '31/1/2010' and '20/6/2010'
je note toutefois que votre remarque portant à appliquer une clause where sur une fonction
n'est pas recommandée.
je vais modifier ma requete
encore merci
Hors ligne
Il y a un date en trop … je l'ai tapée trop vite, désolé.
select * from equipements where date date_maintenance
devient
select * from equipements where date_maintenance
Marc.
Hors ligne
vraiment pas un soucis,
par contre je souhaiterais mettre vos indications en pratique concernant
votre remarque "clause where sur une fonction"
cela donnerais quoi ?
Hors ligne
et une autre question dans la foulée
en réalité chez moi, je dispose d'un champs "unite_periode"
qui pourait être : month ou week
comment l'integrer dans la ligne :
date_maintenance + periodicite * '1 month'::interval
^
unite_periode
merci
Hors ligne
Pour la clause where sur fonction, j'ai fait la correction dans mon exemple : comparer date_maintenance à une valeur, pas date_maintenance + qqchose à une valeur.
Dans ce cas, définissez votre champ unite periode comme étant de type interval, cela sera encore plus direct.
Dans ce cas, la clause deviendra date_maintenance + unite_periode * periodicite
Vous pouvez aussi directement stocker des periodes plus complexes.
Je vous recommande de lire la documentation à ce sujet :
Marc.
Hors ligne
Pages : 1