Vous n'êtes pas identifié(e).
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
ç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
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
si ça marche sil je fait pas des con.....
j'ai oublié de completer : avec interval comme ceci
'1 month'::interval
merci !
Hors ligne
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
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
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
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
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
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
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
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
bien sûr. Tu peux aussi accorder month? ça marchera toujours ?
Dernière modification par Marc Cousin (20/11/2010 21:00:01)
Marc.
Hors ligne
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
Oui, il est très permissif sur la syntaxe des intervalles.
Marc.
Hors ligne
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
Hors ligne