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 19/11/2010 14:58:14

unisol
Membre

Soustraire 2 dates

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

#2 19/11/2010 15:17:58

arthurr
Membre

Re : Soustraire 2 dates

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

#3 19/11/2010 15:20:43

Marc Cousin
Membre

Re : Soustraire 2 dates

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

#4 19/11/2010 15:27:30

unisol
Membre

Re : Soustraire 2 dates

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

#5 19/11/2010 15:31:16

unisol
Membre

Re : Soustraire 2 dates

super c'est ce que je cherchais
merci beaucoup...

pas si raté que ça le clone,

Hors ligne

#6 19/11/2010 15:37:44

Marc Cousin
Membre

Re : Soustraire 2 dates

Ho si, l'original plane dans d'autres sphères smile


Marc.

Hors ligne

#7 19/11/2010 16:56:45

unisol
Membre

Re : Soustraire 2 dates

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

#8 19/11/2010 16:59:55

meles
Membre

Re : Soustraire 2 dates

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

#9 19/11/2010 17:02:59

unisol
Membre

Re : Soustraire 2 dates

chapeau bas...
ça marche

grand merci

Hors ligne

#10 19/11/2010 17:04:27

Marc Cousin
Membre

Re : Soustraire 2 dates

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

#11 19/11/2010 17:13:29

meles
Membre

Re : Soustraire 2 dates

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

#12 19/11/2010 17:18:46

Marc Cousin
Membre

Re : Soustraire 2 dates

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 smile


Marc.

Hors ligne

#13 19/11/2010 17:24:52

meles
Membre

Re : Soustraire 2 dates

Marc Cousin a écrit :

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 smile

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

#14 19/11/2010 17:35:06

Marc Cousin
Membre

Re : Soustraire 2 dates

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

#15 19/11/2010 17:40:58

unisol
Membre

Re : Soustraire 2 dates

Elle sont bien de type date ...
quelle est le risque avec cette syntaxe ?

entete_ot.date_validation::date

Hors ligne

#16 19/11/2010 17:45:03

meles
Membre

Re : Soustraire 2 dates

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

#17 19/11/2010 17:47:10

unisol
Membre

Re : Soustraire 2 dates

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

#18 19/11/2010 17:50:44

Marc Cousin
Membre

Re : Soustraire 2 dates

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

#19 19/11/2010 17:51:05

unisol
Membre

Re : Soustraire 2 dates

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

#20 19/11/2010 18:13:37

unisol
Membre

Re : Soustraire 2 dates

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

#21 19/11/2010 18:17:59

Marc Cousin
Membre

Re : Soustraire 2 dates

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

#22 19/11/2010 18:20:05

unisol
Membre

Re : Soustraire 2 dates

pas d'erreur, mais le résultat de la colonne donne :

13/02/1900   'au lieur de 45

Hors ligne

#23 19/11/2010 18:22:59

Marc Cousin
Membre

Re : Soustraire 2 dates

Ok, donc il reconvertit en date…

Donc le cast est bon, c'est sûr, pas de souci.


Marc.

Hors ligne

#24 19/11/2010 18:49:04

unisol
Membre

Re : Soustraire 2 dates

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

#25 19/11/2010 18:53:13

Marc Cousin
Membre

Re : Soustraire 2 dates

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

Pied de page des forums