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 :

Requête sur les dates


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Par défaut Requête sur les dates
    bonjour,

    admettons une table avec les champs date_debut & date_fin.

    j'aimerais en une requête récupérer toutes les lignes sur admettons un mois entier ou une année...comment procéderiez-vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from table
    where date_debut <= "01/01/2012" and date_fin >= "31/12/2012"
    L'idée étant de récupérer toutes les lignes valide en janvier 2012.

    Merci pour votre aide.
    Sai

  2. #2
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Par défaut
    Bonjour,

    Comme définissez-vous qu'une ligne appartient à telle période ?
    Complètement incluse (date de début et date de fin) dans la période ?
    Ou alors une ligne qui commence (date de début) dans la période appartient à la période ? Ou réciproquement, une ligne qui se termine (date de fin) dans la période appartient à la période ?

    Cordialement,
    FSiebert

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour c'est une bonne approche, par contre là votre requête ne va pas retourner grand chose au vu des conditions de filtre..

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 456
    Par défaut
    Bonjour,
    Je ferai la même chose (en inversant les opérateurs !) ou avec un between:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM TABLE
    WHERE date_debut >= "01/01/2012" AND date_fin <= "31/12/2012"
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM TABLE
    WHERE date_debut between "01/01/2012" AND "31/12/2012"

    Tatayo.

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Je ferai la même chose (en inversant les opérateurs !) ou avec un between:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM TABLE
    WHERE date_debut >= "01/01/2012" AND date_fin <= "31/12/2012"
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM TABLE
    WHERE date_debut between "01/01/2012" AND "31/12/2012"

    Tatayo.

    En fait, si je fais comme ça je récupère bien les données qui commencent entre le 1er janvier et 31 janvier 2012.
    Mais admettons qu'une ligne commence le 31/12/2012 et finisse le 15/12/2012 cette ligne serait exclue...non ?

  6. #6
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Par défaut
    Citation Envoyé par saigon Voir le message
    En fait, si je fais comme ça je récupère bien les données qui commencent entre le 1er janvier et 31 janvier 2012.
    Mais admettons qu'une ligne commence le 31/12/2012 et finisse le 15/12/2012 cette ligne serait exclue...non ?
    D'où ma question...
    Est-ce qu'une ligne est considérée comme appartenant à la période si et seulement si elle commence et se termine dans cette période ?

    Edit : il faudrait également préciser la type de vos colonnes ainsi que votre SGBD pour utiliser les bonnes fonctions de date.

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    D'où ma question...
    Est-ce qu'une ligne est considérée comme appartenant à la période si et seulement si elle commence et se termine dans cette période ?
    Désolé je n'avais pas vu ta réponse

    Une ligne est considérée valide à partir du moment ou elle existe dans cette période. C'est à dire peu importe qu'elle commence avant le 1er janvier 2012 ou se termine après le 31 janvier 2012. L'idée c'est que la ligne ait existé entre le 1er janvier 2012 et 31 janvier 2012.

    par exemple, est valide pour moi :
    01/01/2012 au 06/06/2012
    31/08/2011 au 12/06/2012
    31/01/2012 au 02/02/2012

    n'est pas valide pour moi :
    01/12/2011 au 31/12/2012
    02/02/2012 au 31/12/2012

    merci pour vos retour

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Par défaut
    Citation Envoyé par saigon Voir le message
    Désolé je n'avais pas vu ta réponse

    Une ligne est considérée valide à partir du moment ou elle existe dans cette période. C'est à dire peu importe qu'elle commence avant le 1er janvier 2012 ou se termine après le 31 janvier 2012. L'idée c'est que la ligne ait existé entre le 1er janvier 2012 et 31 janvier 2012.

    par exemple, est valide pour moi :
    01/01/2012 au 06/06/2012
    31/08/2011 au 12/06/2012
    31/01/2012 au 02/02/2012

    n'est pas valide pour moi :
    01/12/2011 au 31/12/2012
    02/02/2012 au 31/12/2012

    merci pour vos retour


    Edit : j'utilise postgreSQL 9 et les champs date_debut et date_fin sont des dates

  9. #9
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Par défaut
    Je ne suis pas sûr d'avoir bien compris votre définition d'existence.
    Est-ce que ceci correspond à ce que vous voulez ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TABLE
    WHERE date_debut <= "31/12/2012" AND date_fin >= "01/01/2012"
    Je suppose que vous contrôlez (check constraint) que date_fin est supérieure à date_debut sinon on risque d'avoir des résultats curieux.

    Je ne connais pas les fonctions dates de PostgreSQL, je vous laisse convertir les chaînes de date en date

  10. #10
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Par défaut
    J'ai donné une solution plus haut qui me semble équivalente et plus performante...
    Dans quel cas ne convient-elle pas ?

    Citation Envoyé par FSiebert Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TABLE
    WHERE date_debut <= "31/01/2012" AND date_fin >= "01/01/2012"
    Je suppose que vous contrôlez (check constraint) que date_fin est supérieure à date_debut sinon on risque d'avoir des résultats curieux.
    Exemple sous Oracle :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    WITH DATA AS (
      SELECT to_date('01/01/2012', 'DD/MM/YYYY') As date_debut,  to_date('06/06/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('31/08/2011', 'DD/MM/YYYY') As date_debut,  to_date('12/06/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('31/01/2012', 'DD/MM/YYYY') As date_debut,  to_date('02/02/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('01/12/2011', 'DD/MM/YYYY') As date_debut,  to_date('31/12/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('02/02/2012', 'DD/MM/YYYY') As date_debut,  to_date('31/12/2012', 'DD/MM/YYYY') As date_fin FROM DUAL
    )
    SELECT * FROM DATA
    WHERE date_debut <= to_date('31/01/2012', 'DD/MM/YYYY') AND date_fin >= to_date('01/01/2012', 'DD/MM/YYYY');
     
    DATE_DEBUT                DATE_FIN                  
    ------------------------- ------------------------- 
    31/08/11 00:00:00         12/06/12 00:00:00         
    01/12/11 00:00:00         31/12/12 00:00:00         
    01/01/12 00:00:00         06/06/12 00:00:00         
    31/01/12 00:00:00         02/02/12 00:00:00
     
    WITH DATA AS (
      SELECT to_date('01/01/2012', 'DD/MM/YYYY') As date_debut,  to_date('06/06/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('31/08/2011', 'DD/MM/YYYY') As date_debut,  to_date('12/06/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('31/01/2012', 'DD/MM/YYYY') As date_debut,  to_date('02/02/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('01/12/2011', 'DD/MM/YYYY') As date_debut,  to_date('31/12/2012', 'DD/MM/YYYY') As date_fin FROM DUAL UNION
      SELECT to_date('02/02/2012', 'DD/MM/YYYY') As date_debut,  to_date('31/12/2012', 'DD/MM/YYYY') As date_fin FROM DUAL
    )
    SELECT * FROM DATA
    WHERE (date_debut <= to_date('01/01/2012', 'DD/MM/YYYY') AND date_fin >= to_date('01/01/2012', 'DD/MM/YYYY') )
    OR (date_debut BETWEEN to_date('01/01/2012', 'DD/MM/YYYY') AND to_date('31/01/2012', 'DD/MM/YYYY') )
    OR ( date_fin BETWEEN to_date('01/01/2012', 'DD/MM/YYYY') AND to_date('31/01/2012', 'DD/MM/YYYY') );
     
    DATE_DEBUT                DATE_FIN                  
    ------------------------- ------------------------- 
    31/08/11 00:00:00         12/06/12 00:00:00         
    01/12/11 00:00:00         31/12/12 00:00:00         
    01/01/12 00:00:00         06/06/12 00:00:00         
    31/01/12 00:00:00         02/02/12 00:00:00
    Edit : je mets 31 janvier et non 31 décembre comme date de fin pour être aligné avec les autres requêtes.

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

Discussions similaires

  1. [MySQL] requète sur les dates dans mysql
    Par laloupiote dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/02/2014, 16h27
  2. Requête sur les dates futures plus une date passée
    Par yonn_b dans le forum Requêtes
    Réponses: 13
    Dernier message: 26/01/2012, 08h59
  3. Problème avec une requête sur les dates
    Par diblasio dans le forum Requêtes
    Réponses: 11
    Dernier message: 09/08/2011, 16h00
  4. Requêtes sur les dates
    Par Sh4dow49 dans le forum SQL
    Réponses: 16
    Dernier message: 04/08/2008, 14h25
  5. [SQL] Requête sur les dates
    Par JohnnyWalk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/12/2007, 19h24

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