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

 MySQL Discussion :

Requête basée sur la date du jour


Sujet :

MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 223
    Par défaut Requête basée sur la date du jour
    Bonjour,

    Je voudrais créer une requête basée sur la date du jour et sur deux champs d'une table, mais je n'ai jamais utilisé les formats de date, et quand je vois toutes les possibilités, je ne sais pas du tout comment m'y prendre...

    J'ai une table HISTOIRE qui contient des articles de presse ancienne.
    Dans cette table, j'ai, entre autre, un champ JOUR et un champ MOIS qui sont les jour et mois de parution de l'article.
    Ces deux champs sont en VARCHAR tous les deux, mais les valeurs y sont entrées en chiffres (de 01 à 31 pour les jours, et de 01 à 12 pour les mois).

    Sur la page d'accueil de mon site, je voudrais proposer de lire un article correspondant au même jour et même mois que la date du jour. Autrement dit : on est le 24 mars 2013, lisez au hasard un des articles de notre collecte paru un 24 mars ! (j'ai au moins un article pour chacun des 365 jours de l'année).
    Comment puis-je faire cela à votre avis ?
    Merci !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    Quelque comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
      article
    FROM
      histoire
    WHERE
      mois = date_format(now(),'%m') AND
      jour = date_format(now(),'%d')
    ORDER BY RAND()
    LIMIT 1 ;
    La fonction NOW() te renvoie la date actuelle. On la passe dans date_format pour n'avoir que le chiffre du mois (ou du jour) dans un VARCHAR qu'il ne reste plus qu'à comparer. On trie le tout de façon aléatoire et on ne renvoie que la première ligne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 223
    Par défaut
    Ça fonctionne impeccable !
    Merci mille fois pour le détail de la fabrication, ça me re-servira !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 223
    Par défaut
    Je reviens ici car je voudrais améliorer ma requête, mais je n'en ai pas tous les moyens !

    Je voudrais pouvoir ajouter, sur ma présentation, "C'était il y a X ans" en me servant du champ annee de l'article et en faisant une différence entre l'année de l'événement et l'année en cours.

    J'ai fini par trouver quelque chose qui pourrait aller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND(DATEDIFF(CURDATE(),'1912-04-01')/365);
    J'ai indiqué une date fictive pour mes essais, et j'ai mis cette requête dans phpmyadmin, j'ai le résultat 101 qui s'affiche. Donc c'est bon.

    Mais je ne sais pas du tout comment intégrer cette requête dans l'autre.
    Comment faut-il faire à votre avis ?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Il suffit de mettre cette formule dans le SELECT de la requête donnée par apaul et de lui donner un alias pour récupérer facilement la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
      article,
      ROUND(DATEDIFF(CURRENT_DATE, annee)/365) AS nb_annees
    FROM
      histoire
    WHERE
      mois = date_format(now(),'%m') AND
      jour = date_format(now(),'%d')
    ORDER BY RAND()
    LIMIT 1
    J'ai supposé qu'il y a aussi une colonne "annee" dans la table.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 223
    Par défaut
    Merci de ton aide !

    La requête fonctionne bien, mais le nombre d'années ne s'affiche pas... Je dois faire une erreur mais je ne la trouve pas.
    Je fais l'affichage comme pour les autres éléments de l'article, qui sont tous sur ce modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $row_rsAnniv['titre']; ?>
    pour afficher le nombre d'années, j'ai donc affiché comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>il y a </strong><?php echo  $row_rsAnniv['nb_annees']; ?> ans
    mais le nombre d'années ne s'affiche pas.
    Comme j'ai adapté la requête, l'erreur est peut-être là :
    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
     
    mysql_select_db($database_conn, $conn);
    $query_rsAnniv = "SELECT
      *,
      ROUND(DATEDIFF(CURRENT_DATE, annee_even)/365) AS nb_annees
    FROM 
      histoire
    WHERE
      mois_even = date_format(now(),'%m') AND
      jour_even = date_format(now(),'%d') AND
      (annee_even <= '1909')
    ORDER BY RAND()
    LIMIT 1";
    $rsAnniv = mysql_query($query_rsAnniv, $conn) or die(mysql_error());
    $row_rsAnniv = mysql_fetch_assoc($rsAnniv);
    $totalRows_rsAnniv = mysql_num_rows($rsAnniv);

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    De quel type est la colonne anne_even ?

    Et, maintenant que j'y pense, elle doit probablement seulement contenir l'année non ?

    Il faudrait alors reconstituer la date complète pour faire le calcul DATE_DIFF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
      , -- les colonnes nécessaires et pas étoile !
      ROUND(DATEDIFF(CURRENT_DATE, CAST(CONCAT(annee_even, '-', mois_even, '-', jour_even) AS DATE))/365) AS nb_annees
    FROM
      histoire
    WHERE
      mois_even = DATE_FORMAT(CURRENT_DATE,'%m') AND
      jour_even = DATE_FORMAT(CURRENT_DATE,'%d') AND
      annee_even <= '1909'
    ORDER BY RAND()
    LIMIT 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 223
    Par défaut
    C'était exactement ça, c'est tout bon !

    J'avais un doute pour le *, maintenant je saurai.
    Merci mille fois à toi !

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

Discussions similaires

  1. Requête SQL basée sur les dates
    Par zwina2004 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/04/2014, 10h33
  2. [AC-2010] Requête basée sur la semaine d'une date
    Par SBIBobinette dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 12/03/2014, 05h30
  3. requête basée sur des intervalles d'heures
    Par lieselotte02 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/06/2007, 21h23
  4. une requête basée sur un seul critère ?
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 18h53
  5. analyse "périodes" basées sur des dates.
    Par Yorglaa dans le forum Oracle
    Réponses: 7
    Dernier message: 22/12/2004, 11h39

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