IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Comparer 2 dates sous PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut Comparer 2 dates sous PL/SQL
    Salut,


    J'arrive pas à faire la difference entre 2 dates, le problème est que:
    J'ai une procedure stockée avec une paramètre en entréee qui est une date et dans la procedure je dois verifier si la date d'entrée est plus grande que les dates dans une table alors j'ai fait (date d'entréee - date dans la table )mais ce qui est bizard que qd j'entre la meme date, il affiche pas 0....
    Comment on fait pour comparer 2 dates, sous Oracle

    Merci,

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    salut,
    il ne faut pas oublier que les dates contiennent également l'heure (et minutes, et secondes, ...)

    alors si tu veux ne comparer que le JOUR, utilise la fonction TRUNC sur chacune de tes dates à comparer pour ramener toutes le heures, minutes, etc... à 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select trunc(sysdate) - trunc(sysdate) from dual
    remène effectivement 0

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Merci pour la réponse, ce que je comprends que sous Oracle il y a pas de fontions pour comparer les dates que faire la soustraction.

  4. #4
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Citation Envoyé par 18Marie
    ce que je comprends que sous Oracle il y a pas de fontions pour comparer les dates que faire la soustraction.

    ???? Pourquoi tu dis ça ?

    Sous Oracle tu peux comparer des dates avec =, >, <, etc et en plus tu peux soustraire des dates ce qui te donne un nombre de jour.

    Ce que Yorglaa te dis c'est qu'il faut faire attention quand tu compares des dates car le format interne est en realité DATETIME et donc si tu fais un test d'égalité deux dates ne sont égales que si elles sont exactement égales à la seconde pres ! D'ou le TRUNC pour arrondir a la journée pres.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Ce qu'elle voudrait à mon avis ce sont des fonctions tout faites du style : GET_NB_DAY(DATE_DEBUT, DATE_FIN) qui calculerait le nombre de jour entre les 2 dates fournies en paramètre, etc.

  6. #6
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Et bien si c'est cela une simple soustraction le fait directement. Pas besoins de fonction. Le resultat est en jours avec eventuellement un partie decimale.

    Par exemple 02/01/2007 12:00 - 01/01/2007 00:00 donnera 1,5 soit un jour et 12heures

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Merci pour vos aides,
    C vraiment ce que je cherche ce sont des fonctions dèjà faits....

    Quand on compare 2 dates avec <,>, est-que les 2 dates doivent etre de type date car moi j'ai 2 dates dont le premier est de type Date et le deuxieme de type String et ca marche alors, je ne sais pas si par hazard que ca fonctionne ???

    Merci

  8. #8
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Tu n'as pas peur ! ! ! !

    Il ne faut jamais comparer des choux et des carrotes.

    Si ca marche c'est qu'Oracle fait une conversion implicite et dans ce cas je suis bien incapable de savoir si il decide de convertir ton string en date ou ta date en string.

    Tu as donc une chance sur deux qu'il ne fasse pas ce que tu veux. Comme je ne suis pas joueur, je preferes toujousr faire une conversion explicite (avec un to_date) et maitriser ce qui se passe plutot que de laisser Oracle faire ce qu'il veut.

    J'irais meme plus loin il faut faire un to_date en precisant le format de conversion parce que c'est pas pcq aujourd'hui ta date en string est dans le format date par defaut qu'un jour cela le changera pas.

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Je suis entièrement avec Wurlitzer, en particulier avec la spécification explicite du format.
    En effet, par expérience, je pense qu'il vaut mieux que le programme plante quitte à avoir une ORA-xxx plutôt qu'il fasse des calculs qui ne sont absolument pas ceux attendus (entre autres parce que les données ont été converties dans un autre format que celui souhaité).

    Un développeur(se) avertit en vaut 2, non ?

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    bonjours j'écrit ici car mon probleme est sensiblement le meme que celui evoqué.

    voila je fait un programme PL/SQL dans lequel je compare deux dates la premiere et recupéré dans un curseur et la seconde est celle du systeme (sysdate) à laquelle je retranche un nombre de jours qui et un number passé en parrametre de la procedure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    begin
        open cur;
        for varcur in cur loop
            if (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) ||
                trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))
        then
            insert into archive values (varcur.num_client,varcur.nom_client,
                    varcur.prenom, varcur.num_reservation, varcur.num_hotel,
                    varcur.nb_cl_invite, varcur.nb_enfant_invit,
                    varcur.Date_deb_Reserv, varcur.date_annulation);
            end if;
        end loop;
    end;
    losque je créé ma procedure j'ai les erreurs suivantes :

    26/44 PLS-00103: Encountered the symbol "<" when expecting one of the
    following:
    . ( ) , * % & - + / at mod remainder rem <an exponent (**)>
    and or ||
    The symbol ")" was substituted for "<" to continue.

    26/73 PLS-00103: Encountered the symbol ")" when expecting one of the
    following:
    * & - + / at mod remainder rem then <an exponent (**)> and or
    || multiset year DAY_


    pour info "cur" est mon curseur.Et la ligne 26 est "if (trunc ..."

    quelqu'un peut il m'éclairer??

  11. #11
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) ||
                trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))
    A la place il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) and 
                trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    merci beaucoup

  13. #13
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Le || c'est un OR non ?
    le && c'est un AND

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Par défaut
    Citation Envoyé par McM
    Le || c'est un OR non ?
    le && c'est un AND
    Effectivement ...

  15. #15
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     create or replace function  pp return date is
     begin
     IF (trunc (to_date('2007-03-01','yyyy-mm-dd')) < (trunc(sysdate)- 3) ||
        trunc (to_date('2007-03-01','yyyy-mm-dd')) < (trunc (sysdate) - 3) ) then
     return sysdate ;
     end if;
     end ;
     /
    Tu auras l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SP2-0317: nom de symbole absent
     
    Avertissement : Fonction créée avec erreurs de compilation.
     
    SQL> show errors ;
    Erreurs pour FUNCTION PP :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    3/69     PLS-00103: Symbole "&" rencontré à la place d'un des symboles
             suivants :
             ) , * & - + / at mod remainder rem <exposant (**)> and or ||

  16. #16
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Citation Envoyé par McM
    Le || c'est un OR non ?
    le && c'est un AND

    Euh vous parlez quelle langue ? en C ok mais en PL/SQL il faut employer OR et AND

  17. #17
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    D'accord avec Wurlitzer, à part la concaténation de 2 champs avec ||, je ne vois pas d'autre utilisation en pl/sql de || et de &&.
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  18. #18
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bien sur je parlais des autres langages de programmation (C, Php, ...)

Discussions similaires

  1. Comment comparer 2 dates sous DOS
    Par Isilog dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 05/03/2009, 17h23
  2. Comparer des dates en T-SQL
    Par AbyssoS dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/03/2006, 16h06
  3. [SQL2K] requête SQL, comparer des dates
    Par cortex024 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/03/2006, 14h32
  4. [SQL] Comparer 2 dates
    Par hoaxpunk dans le forum Oracle
    Réponses: 2
    Dernier message: 24/01/2006, 20h26
  5. format date sous postgres sql
    Par ruppert62 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 27/05/2005, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo