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

Langage SQL Discussion :

Intervalle entre 2 dates (critères cumulés)


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Intervalle entre 2 dates (critères cumulés)
    Bonjour,

    je travaille sur une select qui s'appuie sur des dates, les compare à la date du jour et les classe selon différentes possibilités (CASE) :

    - inférieur au jour actuel
    - jour actuel
    - j+1
    - j+2
    - j+3
    - j+4
    - j+5
    - entre 5 et 10 jours
    - supérieur à 10 jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SELECT CASE
    WHEN CAST (date_rec_min AS DATE) < CAST(NOW() AS DATE) THEN 'DAR valide'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW() AS DATE) THEN 'Jour actuel'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW()+INTERVAL '1' DAY AS DATE) THEN 'J+1'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW()+INTERVAL '2' DAY AS DATE) THEN 'J+2'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW()+INTERVAL '3' DAY AS DATE) THEN 'J+3'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW()+INTERVAL '4' DAY AS DATE) THEN 'J+4'
    WHEN CAST (date_rec_min AS DATE) = CAST(NOW()+INTERVAL '5' DAY AS DATE) THEN 'J+5'
    WHEN CAST (date_rec_min AS DATE) > CAST(NOW()+INTERVAL '5' DAY AS DATE) THEN 'Entre 5 et 10'
    WHEN date_rec_min IS NOT NULL AND CAST(date_rec_min AS DATE) > CAST(NOW()+INTERVAL '10' DAY AS DATE) THEN 'J>10'
    ELSE 'null'
    END,
    CAST(date_rec_min AS DATE) AS "Date récolte minimale", CAST(NOW() AS DATE) AS "Date du jour", exp_raisonsociale AS "Raison sociale", iep_par_nom AS "Nom parcelle", iep_par_varcep AS "Cepage", iep_par_numero AS "Numero parcelle", iep_idparcelleculturale AS "Identifiant parcelle"
    FROM parcelles_2015
    WHERE destination='Thongue et Peyne' AND date_rec_min IS NOT NULL
    ORDER BY CAST(date_rec_min AS DATE) DESC, exp_raisonsociale
    Mon problème est pour le cas de figure entre 5 et 10 jours, je n'arrive pas à comparer par rapport à 2 dates calculées selon la date du jour. Je voudrais cumuler le critères j+5 et j<10 mais ce ne sont pas des booléens. J'ai cherché du coté de BETWEEN mais sans succès, surement un pb de syntaxe.

    Quelqu'un à déjà résolu cette question d'intervalle entre 2 dates ?

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le BETWEEN devrait fonctionner. quelle syntaxe avez vous tentée ?
    Sinon, vous pouvez mettre deux conditions combinées avec un AND, ce qui vous permettrait de gérer plus finement les inclusions dans l'intervalle.
    Enfin, la structure CASE évalue chaque WHEN dans leur ordre d’écriture. Si vous placiez le cas >J+10 avant le cas J+5->J+10, vous n'auriez pas a gérer la borne supérieure pour ce dernier.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 419
    Points : 1 096
    Points
    1 096
    Par défaut
    Bonjour,

    Je remplacerais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN CAST (date_rec_min AS DATE) > CAST(NOW()+INTERVAL '5' DAY AS DATE) THEN 'Entre 5 et 10'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN CAST (date_rec_min AS DATE) BETWEEN CAST(NOW()+INTERVAL '5' DAY AS DATE) AND CAST(NOW()+INTERVAL '10' DAY AS DATE) THEN 'Entre 5 et 10'
    Le BETWEEN marche aussi dans les CASE.
    Sinon ta dernière condition ne se produit jamais
    Cordialement

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Le BETWEEN devrait fonctionner. quelle syntaxe avez vous tentée ?
    Sinon, vous pouvez mettre deux conditions combinées avec un AND, ce qui vous permettrait de gérer plus finement les inclusions dans l'intervalle.
    Enfin, la structure CASE évalue chaque WHEN dans leur ordre d’écriture. Si vous placiez le cas >J+10 avant le cas J+5->J+10, vous n'auriez pas a gérer la borne supérieure pour ce dernier.
    En effet l'ordre des critères fonctionne très bien quand j’intervertis le dernier et l'avant dernier, je me coucherais moins bête merci

    Pour ce qui est des critères cumulées +5 et -10, j'avais un soucis de syntaxe car quand je l'écrivais cela me renvoyait le fait que DATE n'est pas un booléen.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par acaumes Voir le message
    Bonjour,

    Je remplacerais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN CAST (date_rec_min AS DATE) > CAST(NOW()+INTERVAL '5' DAY AS DATE) THEN 'Entre 5 et 10'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN CAST (date_rec_min AS DATE) BETWEEN CAST(NOW()+INTERVAL '5' DAY AS DATE) AND CAST(NOW()+INTERVAL '10' DAY AS DATE) THEN 'Entre 5 et 10'
    Le BETWEEN marche aussi dans les CASE.
    Sinon ta dernière condition ne se produit jamais
    Cordialement
    Comme je dis plus haut, j'avais un soucis de syntaxe sur la position du beetween. En tout cas ça marche impeccable, merci. Je le note sur mes tablettes à l'avenir.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    attention à ne pas utiliser ces fonctions cast et autres concaténations dans les critères de sélection sans quoi les temps de réponse seront catastrophiques

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Reste à espérer que toutes ces fonctions seront faites sur de toutes petites tables, sinon les temps de réponses seront abominables !
    Coté base c'est assez fluide, coté utilisateur c'est en effet plus long. Il serait possible d'optimiser vous penser ?

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Tant que ces conversions sont faites au niveau de la restitution, ce n'est pas nécessaire, si par contre elles devaient concerner le filtrage (where...) ou les jointures (on...) alors ce serait impératif

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Je suis malheureusement obligé de les faire en amont.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Durée - Intervalle entre 2 dates
    Par lilou77 dans le forum SQL
    Réponses: 5
    Dernier message: 27/03/2014, 10h57
  2. intervalle entre deux dates
    Par amazircool dans le forum Langage
    Réponses: 3
    Dernier message: 29/04/2008, 14h25
  3. Intervale entre deux dates
    Par ecirb dans le forum Collection et Stream
    Réponses: 20
    Dernier message: 26/03/2007, 09h21
  4. Intervalle entre deux dates
    Par ecirb dans le forum InfoPath
    Réponses: 15
    Dernier message: 22/03/2007, 10h39
  5. Tester un chevauchement d'intervalle entre 2 dates
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/03/2007, 11h53

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