Vous n'êtes pas identifié(e).
Bonjour,
je souhaite soustraire 2 dates en utilisant la requete suivante (resultat en exprimé en jours):
Select extract(epoch from entete_ot.date_validation - entete_ot.date_debut_intervention) from enteteot;
je reçois l'erreur suivante
/////////
ERREUR: la fonction pg_catalog.date_part(unknown, integer) n'existe pas
LINE 1: Select extract(EPOCH from entete_ot.date_validation - entete...
^
HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
********** Erreur **********
ERREUR: la fonction pg_catalog.date_part(unknown, integer) n'existe pas
État SQL :42883
Astuce : Aucune fonction ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
Caractère : 8
/////
merci pour votre aide
Hors ligne
Bonjour,
extract fonctionne avec un timestamp, et vous lui passez en parametre un interval (a vu d'oeil).
L'exemple suivant focntionne :
Select (extract(epoch from '2010-01-12'::timestamp) - extract(epoch from '2010-01-11'::timestamp));
mais cela renvoi un nombre de secondes entre 2 dates
Hors ligne
Si c'est juste le nombre de jours séparant deux dates qui vous intéresse, utilisez juste l'opérateur de soustraction :
SELECT '2010-10-01'::date - '2010-08-03'::date;
?column?
----------
59
Marc.
Hors ligne
merci ça fonctionne,
les champs sont bien de type date...
j'ai essayé ça mais cela renvoi toujours une durée en seconde
Select (extract(EPOCH from entete_ot.date_validation::date) - extract( epoch from entete_ot.date_ot::date)) from entete_ot;
bon après tout pas bien grave une petite division et le tour est joué
merci encore !
Hors ligne
super c'est ce que je cherchais
merci beaucoup...
pas si raté que ça le clone,
Hors ligne
Ho si, l'original plane dans d'autres sphères
Marc.
Hors ligne
gros probleme...
voici ma requete
Requete = "Select entete_ot.date_validation::date - entete_ot.datemaintenance::date
from Entete_OT where etc...
dans l'interface PGAdmin le résultat de la requete est bon !
"2010-11-29";"2010-10-15";45 >>>45 jours
sous vb6 (désolé...)
pour la meme requete
voici le résultat :
notez le formatage des dates à la française et le big probleme j'ai une date à la ... au lieu des 45 jours
(le 13/02 ...on dirais bien 45 jours après le 1 jan mais voilà)
"29/11/2010";"15/10/2010";13/02/1900
j'imagine que le formatage implicite des dates par vb est nuisible à postgres ?!
comment reformater les dates pour les inverser à l'americaine
car je suppose que le probleme vient de là
de l'aide...merci
Hors ligne
Bonjour,
et en faisant :
Requete = "Select (entete_ot.date_validation::date - entete_ot.datemaintenance::date)::int
from Entete_OT where etc...
Est-ce que ça ne résoud pas le pb ?
Cordialement
Hors ligne
Hors ligne
Si les dates envoyées par VB sont à l'envers, le mieux, c'est probablement de préciser le format à PostgreSQL au moment de la requête:
SELECT to_date('29/11/2010','DD/MM/YYYY) fera la bonne conversion.
Le simple cast ( :: ), comme proposé par meles, ne fonctionnera probablement pas (en tout cas je ne prendrais pas le risque de le laisser «deviner» avec des dates à un autre format que le format ISO).
Au passage, je ne vois pas bien ce que retourne VB…
Dernière modification par Marc Cousin (19/11/2010 17:05:41)
Marc.
Hors ligne
Bonsoir,
VB retourne 45 converti en date '13/02/1900' qui est le 45eme jour de l'année 1900.
C'est une plaie fréquente sous excel qui fait la même chose lorsqu'on fait des opération sur des dates, il renvoie une date qu'il faut ensuite reconvertir en nombre standard.
Pour le cast sur la date, je suis on ne peu plus d'accord avec Marc Cousin, le cast ::date est risqué (je m'étais contenté de reprendre l'exemple donné par unisol (paresse quand tu nous tient)).
Cordialement
Hors ligne
Ok alors. (je dois dire que j'ai la chance de ne plus toucher aux outils MS depuis quelques années).
PS: le but n'est pas de casser les nouveaux contributeurs, hein… au contraire. On essaye juste d'être aussi précis que possible dans les réponses, histoire que les gens ne repartent pas avec une demi-solution qui a l'air de marcher, comme on le voit malheureusement souvent dans les forums.
Donc ne pas s'offusquer si on a l'air de «repasser derrière vous pour en rajouter». On le fait même entre nous
Marc.
Hors ligne
PS: le but n'est pas de casser les nouveaux contributeurs, hein… au contraire. On essaye juste d'être aussi précis que possible dans les réponses, histoire que les gens ne repartent pas avec une demi-solution qui a l'air de marcher, comme on le voit malheureusement souvent dans les forums.
Donc ne pas s'offusquer si on a l'air de «repasser derrière vous pour en rajouter». On le fait même entre nous
Pas de soucis, Marc, si je lis ce forum c'est pour m'améliorer et je suis pas du style à m'offusquer quand quelqu'un prend la peine de compléter une réponse.
Cela dit, c'est curieux de devoir faire une conversion de dernière minute dans le calcul. A corire que les colonnes "entete_ot.date_validation" et "entete_ot.datemaintenance" d'unisol sont déclaré comme du simple texte au lieu d'être des colonne de type date.
Cordialement
Hors ligne
Oui, c'est un peu l'impression que ça donne.
Sinon, elles seraient affichées dans le «bon» sens. unisol ? la définition de la table entete_ot ?
Marc.
Hors ligne
Elle sont bien de type date ...
quelle est le risque avec cette syntaxe ?
entete_ot.date_validation::date
Hors ligne
Hello,
essayes un peu comme ça alors :
Requete = "Select (entete_ot.date_validation - entete_ot.datemaintenance)::int
from Entete_OT where etc...
Si la colonne est déclaré comme une date, à mon avis, c'est pas la peine de la re-caster en faisant ::date.
Cordialement
Hors ligne
je suis daccord avec toi marc, vb est bien vieux (trop !)
et les outils microsoft sont loin d'être une référence,
mais voilà quand tu as un soft disons d'une certaine taille
et que tu ne dispose pas d'une strucure pour le réecrire
dans un langage "moderne" tu rame.
la conversion d'un prog meme par exemple en vb .NET
reste déconseillé par beaucoup.
mon reve serait par exemple le java, ne serait ce par sa capacité
multi-plate forme.
Hors ligne
Je disais juste que je n'ai pas programmé en VB depuis 1999 (je crois), et que je ne m'en plains pas. Et que donc je suis un peu approximatif sur ce langage.
Mais la vraie question, c'est la déclaration de la table. Comment sont déclarées les colonnes ?
Marc.
Hors ligne
nickel à vous tous ... ça marche
voici le code au complet pour d'autre vb-rameur (ps dommage que le forum n'autorise pas l'incrustation d'images)
Select Entete_OT.id_entete_ot, Entete_OT.service, Entete_OT.date_ot, Entete_OT.description, Equipements.designation, " & _
"(EXTRACT(WEEK FROM Entete_OT.datemaintenance)) as SEMPLAN, Entete_OT.Date_validation, (EXTRACT(WEEK FROM Entete_OT.date_validation)) as SEMCLOT, " & _
"entete_ot.datemaintenance, (entete_ot.date_validation - entete_ot.datemaintenance)::int, Entete_OT.cloture_par " & _
"from Entete_OT left JOIN Equipements ON Entete_OT.id_equipement = Equipements.id_equipement " & _
"where Entete_OT.date_validation is not null and Entete_OT.en_instance = false "
Hors ligne
les colonnes sont déclarées en type 'Date'
à noter que malgré que c'est du vb, le pilote est bien postgresql (PGNP)
donc point de syntaxe type MS à l'access.
quelle est ton language maintenant ?
Hors ligne
Si tu es obligé de caster en int la différence, ça donne l'impression que VB ne se rend pas compte que le type retourné est déjà de l'int. C'est vraiment très étrange.
Sans le cast (::int), quelle est l'erreur exactement ?
Marc.
Hors ligne
pas d'erreur, mais le résultat de la colonne donne :
13/02/1900 'au lieur de 45
Hors ligne
Ok, donc il reconvertit en date…
Donc le cast est bon, c'est sûr, pas de souci.
Marc.
Hors ligne
2 problemes vb en un
je souhaite ajouter une périodicité à une date >>>
'2009-10-27' + 12 * '1 month'::interval
j'ai une erreur :
ERREUR: syntaxe en entrée invalide pour le type interval : « 2009-10-27 »
État SQL :22007
Caractère : 197
mais en cherchent un peut je peux trouver tout seul,
mais mon probleme c'est que ma périodicité est en réalité parametrable
ainsi que l'unité
donc comment réecrire cette requete :
insert into ma_table (prochaine_date_maintenance) values (date_actuelle + ( periodicité * unité ))
maladroitement ecrit>> un truc du genre...
'2009-10-27' + periodicité * unite::interval
merci
Hors ligne
Non, c'est qu'il n'arrive pas à deviner tout seul que le premier terme est une date. Il y a évidemment de nombreux opérateurs + (entre entiers, entre floats…), dont un pour faire la somme de deux intervalles, et un autre pour faire la somme d'un intervalle et d'une date.
Puisque vous ne lui précisez pas les types, il tente la somme de deux intervalles. Donc il essaye de convertir la chaine de caractère '2009-10-27' en intervalle. Et évidemment échoue.
Essayez :
'2009-10-27'::date + 12 * '1 month'::interval
Marc.
Hors ligne