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

#26 19/11/2010 18:54:48

unisol
Membre

Re : Soustraire 2 dates

pour être complet voici ma requete tel quelle :

req = _
            "insert into entete_ot " & _
            "(id_entete_ot, service,  datemaintenance, date_demande, date_ot, agent_demandeur, description, maintenance, id_equipement) " & _
            "values ('" & Nro_OT & "', " & _
            "'" & Adodc1.Recordset.fields("service") & "', " & _
            "'" & Adodc1.Recordset.fields("datemaintenance") & "'+ " & Adodc1.Recordset.fields("periodicite") & " * '1 month', " & _
            "current_date, " & _
            "current_date, " & _
            "'AUTOMATIQUE', " & _
            "'" & Adodc1.Recordset.fields("maintenance_periodique") & "', " & _
            "true, " & _
            "'" & Adodc1.Recordset.fields("id_equipement") & "')"

ce qui donne en mode sql pure :


insert into entete_ot (id_entete_ot, service,  datemaintenance, date_demande, date_ot, agent_demandeur, description, maintenance, id_equipement)
values ('18595', 'NEPHROLOGIE - HOSPITALISATION', '2009-10-27' + 12 * '1 month'::interval, current_date, current_date, 'AUTOMATIQUE', '', true, '4854')

ERREUR:  syntaxe en entrée invalide pour le type interval : « 2009-10-27 »
LINE 2: values ('18595', 'NEPHROLOGIE - HOSPITALISATION', '2009-10-2...
                                                          ^


********** Erreur **********

ERREUR: syntaxe en entrée invalide pour le type interval : « 2009-10-27 »
État SQL :22007
Caractère : 197

Hors ligne

#27 19/11/2010 18:59:38

unisol
Membre

Re : Soustraire 2 dates

ça donne :

insert into entete_ot (id_entete_ot, service,  datemaintenance, date_demande, date_ot, agent_demandeur, description, maintenance, id_equipement)
values ('18595', 'NEPHROLOGIE - HOSPITALISATION', '2009-10-27'::date + 12 * '1 month', current_date, current_date, 'AUTOMATIQUE', '', true, '4854')


ERREUR:  syntaxe en entrée invalide pour l'entier : « 1 month »
LINE 2: ...GIE - HOSPITALISATION', '2009-10-27'::date + 12 * '1 month',...
                                                             ^

********** Erreur **********

ERREUR: syntaxe en entrée invalide pour l'entier : « 1 month »
État SQL :22P02
Caractère : 223

Hors ligne

#28 19/11/2010 19:11:05

Marc Cousin
Membre

Re : Soustraire 2 dates

Il faut, dans le deuxième cas, garder aussi le cast pour 1 month …
'2009-10-27'::date + 12 * '1 month'::interval

Sinon, de la même façon, il essaye de deviner le type du membre de droite. Et se trompe aussi.


Marc.

Hors ligne

#29 19/11/2010 19:11:10

unisol
Membre

Re : Soustraire 2 dates

si ça marche sil je fait pas des con.....
j'ai oublié de completer : avec interval comme ceci

'1 month'::interval

merci !

Hors ligne

#30 19/11/2010 20:56:37

meles
Membre

Re : Soustraire 2 dates

Bonsoir,
  pourquoi pas to_date('2009-10-27','YYYY-MM-DD') dans ce cas ?

Le cast suffit-il juste parce que la date est issue d'une colonne typée date dans postgres et que nécessairement, il va la caster correctement ?

Cordialement

Hors ligne

#31 20/11/2010 18:00:16

unisol
Membre

Re : Soustraire 2 dates

je pense que la question de meles est adressé a marc...

Bonjour,

autre probleme toujours par-rapport à ces dates.
voici ma requete :

select * from equipements where  datemaintenance + periodicite * ('1 ' + unite_periode)::interval between '2010/11/15' and '2010/11/27' 

mon champ  unite_periode peut dans mon cas prendre deux valeurs : month et week
comment ecrire ma requete pour que ça marche ?
en d'autres terme concatener le '1' et  unite_periode pour que cela donne soit : '1 month' ou '1 week'

merci d'avance

Hors ligne

#32 20/11/2010 18:40:02

Marc Cousin
Membre

Re : Soustraire 2 dates

Meles: Oui, si le cast est déjà dans le bon format, il va la caster correctement. Ce qui ne veut pas dire que c'est une bonne idée, de se contenter du cast: il est tout à fait imaginable que le format d'entrée par défaut ait été modifié. Le format «ISO» (Annéee-Mois-Jour) devrait toujours être reconne correctement. Parcontre, les autres formats, c'est à voir :
Pour un datestyle à 'ISO,DMY',

SELECT '2000-12-18'::date;
    date   
------------
2000-12-18
(1 ligne)


SELECT '18-12-2000'::date;
    date   
------------
2000-12-18
(1 ligne)



SELECT '12-18-2000'::date;
ERREUR:  valeur du champ date/time en dehors des limites : « 12-18-2000 »



SET datestyle TO 'ISO,MDY';

SELECT '12-18-2000'::date;
    date   
------------
2000-12-18
(1 ligne)

Bref, à part à utiliser le format ISO en tout temps, on prend des risques à ne pas utiliser to_date, qui évite les ennuis.


Marc.

Hors ligne

#33 20/11/2010 18:42:48

Marc Cousin
Membre

Re : Soustraire 2 dates

Unisol:

Le plus simple, c'est que 'unite_periode' soit de lui même un type interval. Dans ce cas, il peut être défini par l'appelant comme «1 month» ou ce qu'il veut d'arbitraire.

Sinon, la syntaxe est une syntaxe de concaténation :
SELECT ('1'||' month')::interval;

C'est || l'opérateur de concaténation en SQL.


Marc.

Hors ligne

#34 20/11/2010 19:46:15

unisol
Membre

Re : Soustraire 2 dates

merci pour la réponse .

si j'ai bien compris :
aujourd'hui j'ai une déroulante dans laquelle  est contenu deux unites:
month et week
tu me propose de remplacer ces deux valeurs
par '1 month' et '1 week'
ce qui m'efface mon probleme de concaténation ?

Hors ligne

#35 20/11/2010 19:48:26

Marc Cousin
Membre

Re : Soustraire 2 dates

non. La liste déroulante est une chaîne de caractère. 1 month sera aussi une chaîne de caractère. Moi, c'était dans l'hypothèse où, côté client, tu puisse déclarer un paramètre de type interval. Mais c'est probablement trop compliqué en VB. Donc la solution à base de concaténation (en utilisant donc ||) est la plus simple.


Marc.

Hors ligne

#36 20/11/2010 20:07:25

unisol
Membre

Re : Soustraire 2 dates

j'avoue ne pas avoir tout compris dans ta derniere explication (déclarer un paramètre de type interval)

pas grave la concaténation marche (j'ai du mettre des parenthèses )

select * from equipements where
datemaintenance + periodicite * ('1 '||unite_periode)::interval
between '2010/11/15' and '2010/11/27' 

super grand merci
entre hier et aujourd'hui j'ai vraiment avancé
bien evidemment tout ceci est pour remplacer une base acces (sans commentaires)
code vb6 driver PGNP ADO + postgresql 8.4

Hors ligne

#37 20/11/2010 20:15:38

unisol
Membre

Re : Soustraire 2 dates

au moment d'avoir publié
je pense à un truc
la syntaxe '1 month' peut prendre comme aspect par exemple : '12 month'
auquelle cas je peux ecrire

datemaintenance   + ( periodicite  || unite_periode)::interval
ce qui me donnerais traduit par le moteur postgres
'2010-10-13' + '12month'

j'ai essayé ça marche !

Hors ligne

#38 20/11/2010 20:59:44

Marc Cousin
Membre

Re : Soustraire 2 dates

bien sûr. Tu peux aussi accorder month? ça marchera toujours ? smile

Dernière modification par Marc Cousin (20/11/2010 21:00:01)


Marc.

Hors ligne

#39 20/11/2010 21:37:35

unisol
Membre

Re : Soustraire 2 dates

TOUT BON !!!
ce que je comprends pas( mais qui marche)
si je concatène
(periodicite  || unite_periode)
ce qui doit donner par exemple
12month

il manque l'espace entre le 12 et month et pourtant postgres ne dit rien exécute sans rechigner...

Hors ligne

#40 20/11/2010 21:48:01

Marc Cousin
Membre

Re : Soustraire 2 dates

Oui, il est très permissif sur la syntaxe des intervalles.


Marc.

Hors ligne

#41 21/11/2010 18:58:24

unisol
Membre

Re : Soustraire 2 dates

bonsoir,

dans la requete suivante :

Select * from Equipements  where  (EXTRACT(YEAR FROM Entete_OT.date_validation)) = 2010

je souhaiterais simplifier pour n'écrire que 10 au lieur de 2010

merci pour votre aide ou suggestions

Hors ligne

#42 21/11/2010 22:14:22

Marc Cousin
Membre

Re : Soustraire 2 dates


Marc.

Hors ligne

Pied de page des forums