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

Langage SQL Discussion :

Probleme conditions date


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Probleme conditions date
    Bonjour, je dois chercher dans la table UTS plusieurs numéros (num) , le champ dat_ol doit être antérieure à la date de fin de mois et dat_im nulle ou postérieure à la date de fin de mois.
    La date de fin de mois est un paramètre qui pour cet exemple est '01/01/2019'.
    Il faut donc récupérer toutes les valeurs dont le mois est 01 et l'année 2019.
    On doit donc récupérer toutes les valeurs dont le champ dat_ol est égale au mois de janvier 2019.

    J'ai commencé par créer ce code mais ma requête ci-dessous ne renvoie pas le résultat attendu :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select MAX(dat_ol), num, dat_im
    from uts
    where EXTRACT(MONTH FROM date '01/01/2019') = EXTRACT(MONTH FROM dat_ol )  
    AND EXTRACT(YEAR FROM date '01/01/2019') = EXTRACT(YEAR FROM dat_ol )
    AND EXTRACT(MONTH FROM date '01/01/2019') < EXTRACT(MONTH FROM dat_im) 
    AND EXTRACT(YEAR FROM date '01/01/2019') < EXTRACT(YEAR FROM dat_im)
    OR dat_im is null
    GROUP BY num, dat_im


    La partie supérieure de la requête marche parfaitement et ne doit pas être modifié :
    [CODE]
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select MAX(dat_ol), num, dat_im
    from uts
    where EXTRACT(MONTH FROM date '01/01/2019') = EXTRACT(MONTH FROM dat_ol )  
    AND EXTRACT(YEAR FROM date '01/01/2019') = EXTRACT(YEAR FROM dat_ol )


    Merci d'avance.

  2. #2
    Modérateur

    Suivant le SGBD que tu utilises, tu peux bénéficier de certaines fonctions de gestion de date qui simplifieraient bien ta requête.
    Quel est-il ?
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Membre averti
    Sous Oracle je ferais un truc du genre (ne pas appliquer de fonction sur dat_ol pour permettre l'application éventuel d'un index):

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  MAX(dat_ol), num, dat_im
    from uts
    where dat_ol between trunc(to_date('01/01/2019', 'dd/mm/yyyy'), 'mm') and last_day(to_date('01/01/2019', 'dd/mm/yyyy'))
      and nvl(dat_im, last_day(to_date('01/01/2019', 'dd/mm/yyyy')+1) > last_day(to_date('01/01/2019', 'dd/mm/yyyy')
    GROUP BY num, dat_im;


    J'ai supposé que la date en paramètre pouvait être n'importe quelle date dans le mois en question.

  4. #4
    Modérateur

    bonjour,


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    AND EXTRACT(MONTH FROM date '01/01/2019') < EXTRACT(MONTH FROM dat_im)


    Cette condition ne sera jamais vraie, puisqu'il n'existe pas de mois dont le numéro est strictement inférieur à 1...

  5. #5
    Expert éminent
    Bonjour,

    Pour moi c'est l'inverse, la condition est toujours vrai, sauf pour janvier.

    Par contre pour la requête, ce ne serait pas plus performant de calculer les dates de début et de fin dans le code de l'application, et d'utiliser des between ?

    Tatayo.

  6. #6
    Nouveau membre du Club
    Citation Envoyé par al1_24 Voir le message
    Suivant le SGBD que tu utilises, tu peux bénéficier de certaines fonctions de gestion de date qui simplifieraient bien ta requête.
    Quel est-il ?
    Je suis sur PGAdmin.

  7. #7
    Nouveau membre du Club
    La solution de la requête était donc :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select MAX(dat_ol), num, dat_im
    from uts
    where EXTRACT(MONTH FROM date '01/01/2019') = EXTRACT(MONTH FROM dat_ol)  
    AND EXTRACT(YEAR FROM date '01/01/2019') = EXTRACT(YEAR FROM dat_ol)
    AND (date '31/01/2019' < dat_im
    OR dat_im is null)
    GROUP BY num, dat_im

  8. #8
    Modérateur

    Citation Envoyé par tatayo Voir le message

    Pour moi c'est l'inverse, la condition est toujours vrai, sauf pour janvier.
    Ha oui; en effet... mea culpa !

  9. #9
    Modérateur

    C'est très bien d'utiliser le littéral DATE pour passer une date, mais le format doit respecter celui de la norme ISO : YYYY-MM-DD.
    Je comprends que c'était pour l'exemple et illustrer la valeur d'un paramètre - mais autant être juste quand c'est possible.