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 :

Sélectionner plusieurs dates dans un champ date


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut Sélectionner plusieurs dates dans un champ date
    Bonjour,

    j'aimerais pouvoir récupérer en une seule requête une liste d'utilisateurs s'étant connecté au moins une fois par mois les 3 derniers mois, et j'avoue être un peu coincé au niveau de mes conditions...

    donc dans l'exemple qui va suivre je veux récupérer ceux qui se sont connectés en septembre, en aout et en juillet...

    si j'écris ça =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT `nom_utilisateur` FROM `historique` as HISTO
    JOIN `utilisateurs` as USERS ON USERS.`id` = HISTO.`user_id`
    WHERE `action` = 'connexion'
    AND (DATE_FORMAT(`date`, '%Y-%m') = '2017-09'
    OR DATE_FORMAT(`date`, '%Y-%m') = '2017-08'
    OR DATE_FORMAT(`date`, '%Y-%m') = '2017-07')
    je récupère les utilisateurs qui se sont connectés en septembre, ou en aout, ou en juillet

    et si j'écris ça =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT `nom_utilisateur` FROM `historique` as HISTO
    JOIN `utilisateurs` as USERS ON USERS.`id` = HISTO.`user_id`
    WHERE `action` = 'connexion'
    AND DATE_FORMAT(`date`, '%Y-%m') = '2017-09'
    AND DATE_FORMAT(`date`, '%Y-%m') = '2017-08'
    AND DATE_FORMAT(`date`, '%Y-%m') = '2017-07'
    je récupère rien du tout, car le champ date pour un enregistrement ne peut avoir 3 valeurs différentes

    quelqu'un a-t-il une solution ?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    j'aimerais pouvoir récupérer en une seule requête une liste d'utilisateurs s'étant connecté au moins une fois par mois les 3 derniers mois
    Décomposons le besoin...

    1) Quels sont les utilisateurs qui se sont connectés au moins une fois durant le dernier mois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH) AND CURRENT_DATE
    2) Quels sont les utilisateurs qui se sont connectés au moins une fois durant l'avant dernier mois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
    3) Quels sont les utilisateurs qui se sont connectés au moins une fois durant l'avant-avant dernier mois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH)
    4) Faisons une union complète des trois requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH) AND CURRENT_DATE
    UNION ALL
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
    UNION ALL
    SELECT DISTINCT user_id AS id_user
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH)
    => Un user qui se sera connecté durant chacun des trois mois apparaîtra trois fois dans le résultat de cette requête

    5) Groupons les utilisateurs et ne gardons que ceux qui sont présents trois fois. Profitons-en pour enfin récupérer leur nom d'utilisateur :
    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
    SELECT u.nom_utilisateur
    FROM utilisateurs AS u
    INNER JOIN
    (
    	SELECT DISTINCT user_id AS id_user
    	FROM historique
    	WHERE action = 'connexion'
    		AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH) AND CURRENT_DATE
    	UNION ALL
    	SELECT DISTINCT user_id AS id_user
    	FROM historique
    	WHERE action = 'connexion'
    		AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
    	UNION ALL
    	SELECT DISTINCT user_id AS id_user
    	FROM historique
    	WHERE action = 'connexion'
    		AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AND DATE_SUB(CURRENT_DATE, INTERVAL 2 MONTH)
    ) AS tmp ON tmp.user_id = u.id
    GROUP BY u.nom_utilisateur
    HAVING COUNT(*) = 3

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    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 311
    Points : 39 675
    Points
    39 675
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Attention : les fonctions de manipulations de date sont significativement différentes d'un SGBD-R à l'autre, sans précision sur celui-ci, il est difficile de proposer une solution directement applicable

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Visiblement, vu les noms de colonnes entourées d'apostrophes inversées, c'est du MySQL. J'ai donc répondu en ce sens.
    Peut-être même que je me suis cru sur le forum MySQL en répondant.

  5. #5
    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,

    Une alternative : Chercher les connexions sur les trois derniers mois, regrouper par utilisateur, et ne garder que ceux ayant 3 mois distinct.

    soit quelque chose comme ceci (pas testé et a adapter au SGBD)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT user_id 
    FROM historique
    WHERE action = 'connexion'
    	AND `date` BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AND CURRENT_DATE
    GROUP BY user_id 
    HAVING COUNT(DISTINCT MONTH(`date`)) = 3

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos solutions, elles fonctionnent
    Je suis bien sur MySQL !!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 874
    Points : 53 048
    Points
    53 048
    Billets dans le blog
    6
    Par défaut
    Vous avez toujours le choix dans la date ?

    A +

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

Discussions similaires

  1. [LibreOffice][Tableur] Récupérer date d'un champ date dans un formulaire
    Par Eklaes dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 11/12/2014, 11h11
  2. [AC-2003] Vider champ date si autre champ date rempli
    Par lucas-18 dans le forum IHM
    Réponses: 3
    Dernier message: 19/01/2011, 20h25
  3. [MySQL] insertion d'une date dans un champ DATE
    Par Snipy dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 25/10/2010, 09h22
  4. [Dates] Plusieurs variables dans un champ?
    Par covin85 dans le forum Langage
    Réponses: 10
    Dernier message: 11/02/2007, 19h27
  5. Comment fixer une date dans un champ !
    Par LATHIOS dans le forum Access
    Réponses: 8
    Dernier message: 17/06/2005, 19h44

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