PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 08/06/2010 11:21:58

unisol
Membre

calcul de date

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

#2 08/06/2010 11:37:38

Marc Cousin
Membre

Re : calcul de date

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

http://docs.postgresql.fr/8.4/datatype-datetime.html


Marc.

Hors ligne

#3 08/06/2010 12:30:09

unisol
Membre

Re : calcul de date

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

#4 08/06/2010 12:32:30

Marc Cousin
Membre

Re : calcul de date

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

#5 08/06/2010 13:08:18

unisol
Membre

Re : calcul de date

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

#6 08/06/2010 13:11:45

unisol
Membre

Re : calcul de date

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

#7 08/06/2010 14:11:17

Marc Cousin
Membre

Re : calcul de date

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 :

http://docs.postgresql.fr/8.4/datatype-datetime.html

http://docs.postgresql.fr/8.4/functions-datetime.html


Marc.

Hors ligne

Pied de page des forums