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

  1. #1
    Membre du Club
    [SQL] Trouver la date maximum parmis 3 dates (fonction?)
    Bonjour,

    Question épineuse aujourd'hui. Dans un ordre SELECT, je doit récupérer le premier jour du mois suivant le maximum de 3 dates.

    Concretement, pour une ligne de ma table j'ai 3 dates : date1, date2 et date3. Je veux recuperer la date la plus élevé de ces 3 dates et calculer le premier jour du mois suivant.

    Pour le premier jour du mois suivant, je m'en sort avec une concaténation et quelques ADD_MONTHS avec un truc du style :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    to_date('01/'||to_char(add_months(date1,1),'MM')||'/'||to_char(add_months(date1,1),'YYYY'),'DD/MM/YYYY')



    Le problème, c'est pour récupérer le maximum des 3 dates. J'utilise des CASE (je suis en 9i) mais c'est lourd et moche.

    Si quelqu'un aurait une piste de reflexion plus propre, je suis preneur.
    Merci d'avance

  2. #2
    Membre expérimenté
    bah pour recuperer la date maxi

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT max(tadate) FROM tatable
    devrait suffire

    Ensuite tu utilisera un TRUNC pour trouver le premier jour du mois

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    SELECT trunc(add_months(sysdate,1),'Month')
    from dual

  3. #3
    Membre du Club
    C'est pas tout à fait ça : en fait je me suis mal exprimé. Dans ma table, j'ai 3 champs DATE (pour une ligne j'ai donc 3 dates différentes). Je cherche la valeur maximum de ces 3 champs

  4. #4
    Membre expérimenté
    Essaie

    SELECT MAX(date1,MAX(date2,date3))
    FROM tatable

  5. #5
    Membre du Club
    non, non la commande MAX ne permet que de jouer sur les valeurs d'une même colonne (erreur ORA-00909 : Nombre d'argument incorrect avec ta proposition).

    Arf! Je sais, ce n'est pas simple

  6. #6
    Membre expérimenté
    pardon c greatest à la place de max

  7. #7
    Membre du Club
    ENORME !!!

    C'est excellent ! Ca marche de la folie. Toutes mes félicitations, j'ai appris une nouvelle fonction aujurd'hui. Je n'en avais jamais entendu parler.

    Seul bémol, lorsque l'une des date est nulle, ça ne marche plus. Ca m'a contraint à la bidouille suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GREATEST(
     DECODE(date1,NULL,TO_DATE('01/01/1900','DD/MM/YYYY'),date1),
     DECODE(date2,NULL, TO_DATE('01/01/1900','DD/MM/YYYY'), date2),
     DECODE(date3,NULL,TO_DATE('01/01/1900','DD/MM/YYYY'), date3)
     )


    Encore merci !

  8. #8
    Expert éminent sénior
    S'il s'agits de colonnes de la même ligne, vous pouvez également utiliser la fonction GREATEST(col1, col2,...,coln) qui retourne la valeur la plus élevée de la liste.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  9. #9
    Membre expérimenté
    sinon utilise la fonction NVL pour les valeurs nulle

###raw>template_hook.ano_emploi###