Sql comparaison date sans l'année

gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 19/04/2021 à 22:38


Bonjour,
J'ai une table dans laquelle je veux mettre des événements qui reviennent chaque année à dates fixes, donc il me faut des colonnes avec date-debut et date-fin, dans lesquelles il n'y aurait que le jour et mois et pas d'année. Je me demande quelles valeurs et formats je dois mettre pour ces colonnes, vu que bien sûr, je vais devoir les comparer avec le jour et le mois courant ?
carpe diem

Répondre à ce message

Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 20/04/2021 à 11:58


Bonjour,
à tester
INSERT INTO latable (date-debut) values (DATE_FORMAT(NOW(), "%d/%m") )
mais maintenant, il faut sans doute utiliser un format VARCHAR parce que ce format risque de ne pas être accepté sous le format DATE

Plus tard, dans un autre langage, comme PHP
if (DATE_FORMAT(NOW(), "%d/%m")) = date-debut) {....}

Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 26/04/2021 à 01:49


Bonjour,

Je pensais plutôt faire directement une requête de ce genre:
SELECT id, img, debut, fin FROM decors_saison WHERE debut <= DATE_FORMAT(NOW(), '%d/%m) AND fin <= DATE_FORMAT(NOW(), '%d/%m)
et afficher ensuite son résultat avec du php..
carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 26/04/2021 à 02:14 Modifié par Bipbipcoyote


Bonjour,
ok moi j'ai interprété '"mettre des évènements" par "créer un événement" d'où un INSERT, toi tu veux SELECTionner un événement qui est déjà dans la table et le comparer au mois en cours. Tu es déjà une étape plus loin [:D]
Avant de le comparer, il faut que l'évènement existe...
Attention, je ne suis pas sûr que tu puisses envoyer une donnée de type DATE dans MySQL sous le format mm/yy , c'est un peu trop simple car déjà le format dans sql est un format anglais si je me souviens bien donc il faut utiliser du VARCHAR...

regarde un peu cette vidéo
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 26/04/2021 à 11:34 Modifié par Bipbipcoyote


Bonjour,
Je ne sais pas ce que tu souhaites faire mais pour ce genre de truc, idéalement il faut qu'il y ait une surveillance continue sinon, tes événements ne sont visibles que lorsque tu ouvres la page... Un truc encore plus simple que la vidéo est d'utiliser un agenda Google, tu peux obtenir un truc comme cette page (remonte jusqu'en Février ou Mars 2019, là il y a un événement, clique dessus)
Pour faire cela, c'est très simple il faut récupérer le code d'une iFrame... Tu peux reproduire un événement du calendrier suivant le délai que tu fixes . Lorsque tu créés l'événement (date du début-date de fin) tu peux demander un rappel pour chaque année ou mois ou semaine ou jour et tu peux voir sur le lien que les visiteurs peuvent ajouter l'événement à leur propre calendrier et ainsi recevoir eux aussi une notification quelques jours avant
tu peux activer une notification sur ton bureau ou recevoir un email
(l'autorisation dont il parle c'est en cliquant sur le petit cadenas à côté de l'url mais je pense que l'email est plus pratique, à moins d'ajouter la page de l'agenda au démarrage de ton navigateur et de ne jamais fermer celui-ci, simplement le réduire
Et pour créer un événement il y a plein de possibilités
Tu peux créer autant d'agendas que tu veux, ainsi tu peux créer un agenda différent pour chaque site web. Il suffit de faire attention de sélectionner le bon avant de créer l'événement
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 26/04/2021 à 18:18 Modifié par gaston


Bonjour,

Je connais les agendas Google, et c'est vrai que c'est pratique: je les utilise déjà sur des sites comme celui-ci: http://graindphonie.moumour.free.fr/agenda.php

Ce que je veux faire, c'est autre chose:
sur cette page: http://lesamisducamgran.free.fr tu vois l'image des poissons ? C'est à cet emplacement que ça se passe. Pour l'instant, j'ai les coordonnées de toutes les images, enregistrées dans ma bdd, et je modifie manuellement via l'administration du site, celle que je veux afficher. Je voudrais automatiser cela en partie:

- dans un premier temps, j'ai 4 images qui correspondent aux saisons, et je voudrais qu'elles s'affichent automatiquement dans la page pour la durée de la saison en question. Tu me diras que je pourrais faire un switch case en php pour ces 4 images ? oui, je pourrais... [:D]

- dans un deuxième temps, j'ai d'autres images qui correspondent aux diverses fêtes et autres de l'année: Pâques, Carnaval, Chandeleur, mais aussi de petits décors genres stalactites de glace, poissons d'avril, crêpes, champignons, vendanges, etc... réparties de manière fixe, tout au long de l'année. Là pour le coup, le switch case ça fait un peu lourd, vu le nombre, d'autant plus que je souhaite pouvoir en enlever ou en rajouter éventuellement

Pour ces 2 premières catégories d'image, puisque cela revient pareil chaque année, je n'ai besoin que du jour et du mois.

- dans un troisième temps, j'ai des évènements genre tournoi de belote ou de pala, jeux de quilles, randonnées, apéro, repas, etc (c'est une asso de village) qui eux arrivent de ci de là au cours de l'année et donc là, par contre, j'ai besoin de l'année, puisque ce sont des dates précises.

Pour l'affichage, les images n'étant pas très lourdes, je comptais les empiler (lorsque les requêtes les trouvent en comparant avec la date du jour), en mettant par exemple un z_index 11 pour les saisons, 12 pour les fêtes et 13 pour les évènements, ainsi ça permettrait d'afficher l'image prioritaire que l'on souhaite, puis de retrouver une image plus institutionnelle quand le moment est passé, et ça, sans avoir besoin de le faire manuellement: si la requête ne trouve pas l'image de z_index 13, l'image du dessous avec z_index 12 apparaitra alors (en fait il y a une requête différente par couche d'image)

Pour l'instant, mon problème est surtout de pouvoir afficher une image tous les ans à une date fixe.
J'avais bêtement pensé mettre la date en bdd sous ce format: 0426 (pour le 26 avril par exemple)
puis faire une concaténation des strftime et comparer ainsi
$maintenant = strftime("%m").strftime("%d");
$retour = $bdd->prepare('SELECT * FROM t_img_deco WHERE debut >= :maintenant AND fin <= :maintenant') or die(print_r($bdd->errorInfo()));
$retour->execute(array('maintenant'=>$maintenant));
if($data = $retour->fetch())
{
echo '<img src="images/decors/'. $data['fichier_deco']." />';
} ?>

mais je suppose qu'il faut convertir ladite concaténation en nombre ou quelque chose comme ça ? Bref je n'y arrive pas
carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 26/04/2021 à 23:07 Modifié par Bipbipcoyote


Bonjour,
ok, je comprends ce que tu veux faire, en fait pour retrouver l'image, dans ta table il faut simplement un champ texte (varchar) qui contient l'url de l'image et si possible en relatif. par exemple ../images/decors/poissonsAvril.png ou simplement le nom de l'image si le chemin et l'extension sont toujours les mêmes

C'est bien ce que je pensais MySQL n'accepte pas un format date en jj/mm donc il faut faire des champs date classiques (yyyy-mm-dd), faire un script php qui se déclenche au chargement de la page qui va faire un update de la date debut et la date fin avec l'année en cours .... si j'ai en date_debut 2020-04-26, il faut récupérer les 6 caractères de droite de cette donnée dans une variable, concaténer l'année en cours avec date("Y");
et faire l'update, du coup, ce ne sera plus 2020-04-26 qui sera dans la table mais 2021-04-26
Pour les images qui doivent correspondre à un mois, tu mets une date de début sur le premier jour du mois, exemple 2020-04-01 et une fin sur le dernier, exemple 2020-04-30 , elles deviendront cette année 2021-04-01 et 2021-04-30

Le code

$req = 'SELECT * FROM t_evenements';
if(!$retour = $db->query($req)){die('Il y a une erreur dans la requête [' . $db->error . ']');}
while($donnees = $retour->fetch_assoc())
{
$id = $donnees['Id_Evenement'];
$nouveau_debut = date("Y").substr($donnees['Debut'],-6);
$nouvelle_fin = date("Y").substr($donnees['Fin'],-6);
$sql = 'UPDATE t_evenements SET debut = "'.$nouveau_debut.'", fin = "'.$nouvelle_fin.'" WHERE Id_Evenement = "'.$id.'"';
$res = $db -> query($sql);
}

Donc, comme tu le vois, on fait une boucle sur la table, on récupère 6 caractères des champs Debut et Fin que l'on concatène avec l'année en cours et on fait une mise à jour. On obtient donc les dates qui avaient été encodées mais avec l'année en cours

Une fois que les dates sont modifiées avec l'année en cours, tu peux alors faire un select between entre dates de début et de fin avec lequel tu récupères l'URL de l'image
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 27/04/2021 à 00:01


Bonjour,

Ah ok, je vois. Judicieux.
J'avais songé à séparer le jour et le mois des dates de début et de fin (quitte à faire une colonne pour chaque) , comparer d'abord le mois avec celui d'aujourd'hui, puis en fonction du resultat, le jour, et sélectionner l'enregistrement correspondant. mmais je trouvais que ça faisait un peu usine à gaz [:D]
carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 27/04/2021 à 00:45 Modifié par Bipbipcoyote


Bonjour,
je ne sais pas si tu as vu le code, car j'avais une petite erreur, tous les enregistrements recevaient la dernière définition de $nouveau_debut et $nouvelle_fin
Maintenant ça fonctionne chacun conserve bien son jour et son mois
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 27/04/2021 à 01:08


Bonjour,
J'avais vu le code, mais je n'avais pas testé: j'ai décidé qu'à partir d'une certaine heure, j'éteins mon ordi, sinon je passe la nuit dessus, et le lendemain, je suis au radar [:D]
Par contre mon smartphone me permet de continuer à hanter les forums [;)]

carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 27/04/2021 à 05:06 Modifié par Bipbipcoyote


Bonjour,
le reste du code


$Recherche = date("Y").'-'.date("m").'-'.date("d");
$req = 'SELECT * FROM t_evenements WHERE "'.$Recherche.'" BETWEEN Debut AND Fin';
if(!$retour = $db->query($req)){die('Il y a une erreur dans la requête [' . $db->error . ']');}
while($donnees = $retour->fetch_assoc())
{
echo '<img src="'.$donnees['Url'].'">';
}
if(mysqli_num_rows($retour) == 0) {echo '<img src="../photos/wayne.jpg">';}


wayne.jpg étant une image par défaut si la requête ne retourne aucun résultat
tu peux voir mes essais sur cette page et y récupérer le code en format txt
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 28/04/2021 à 00:32


Bonjour,

J'ai réfléchi de mon côté et j'ai trouvé cette requête qui semble fonctionner, à partir du moment où j'ai entré mes dates de début et de fin avec une année quelconque:

SELECT *
FROM `matable`
WHERE DATE_FORMAT( debut, "%m%d" ) <= DATE_FORMAT( now( ) , "%m%d" )
AND DATE_FORMAT( fin, "%m%d" ) >= DATE_FORMAT( now( ) , "%m%d" )

avec ça, je n'ai plus besoin de me soucier de mettre l'année à jour...
qu'en penses-tu ?
carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 28/04/2021 à 02:28 Modifié par Bipbipcoyote


Bonjour,
oui, c'est encore mieux.
Je me suis trop focalisé sur le format date dans la base MySQL.
En fait, cette fonction convertit un string en date, donc, tu peux stocker tes valeurs dans un champ varchar - à tester...Alors oui, mais le varchar doit être de 10 caractères et respecter le format yyyy-mm-dd

Je suppose que tu vas aussi mettre un champ "categories" car si j'ai bien compris, tu vas utiliser ce système dans différentes rubriques et à différents endroits de tes pages
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 28/04/2021 à 16:25 Modifié par gaston


Bonjour,
Pour me simplifier la tâche, et éviter les confusions, j'ai carrément créé 3 tables, une par catégorie, où j'enregistre mes noms de fichiers, le alt de l'image, et les dates de de début et de fin, ces dernières au format yyyyy-mm-dd, avec le jour, le mois et n'importe quelle année (à dire vrai, j'ai fait mes tests avec l'année 0000).
3 tables donc car j'ai:

1) les saisons: printemps, été ,automne, et hiver (hiver que j'ai coupé en 2 parties: 21 dec -> 31 dec et 1 jan ->20 mars, sinon ça posait un problème)

2) les fêtes: Chandeleur, pâques, 1er mai etc, que j'étale sur quelques jours (avant et après)

3) les évènements: tournois, apéros, repas avec des dates précises année comprise (et j'envisage de rajouter un lien vers une page donnée)

(Je n'ai pas encore fait mes pages d'administration, mais en principe, les 2 premières catégories seront fixes, seule la troisième sera modifiable par formulaire)

et j'affiche le tout avec ce code, qui empile les différentes images, avec des z-index différents:


<style>
img.superpose1 { border: 2px solid #ffff00; top: 0px; left: 0px; width: 100%;}
img.superpose { border: 2px solid #ffff00; position: absolute; top: 0px; left: 0px; width: 100%; }
</style>
<div class="panel-body" id="decosbody" style="padding:0px; position: relative">
<!-- Image de fond pour remplir l'espace, sinon le div d'en dessous remonte -->
<img src="images/decors/fond.png" class="superpose1" data-nozoom="true" alt="" style="z-index: 9;" />
<?php
require("connexion,php");
//image des saisons: deco1
$retour1 = $bdd->prepare('SELECT * FROM `t_img_deco1` WHERE DATE_FORMAT(now(),"%m%d") BETWEEN DATE_FORMAT(debut,"%m%d") AND DATE_FORMAT(fin,"%m%d")') or die(print_r($bdd->errorInfo()));
$retour1->execute(array());
if($data1 = $retour1->fetch())
{
echo '<img src="images/decors/1/'. $data1['fichier_deco'].'" class="superpose" data-nozoom="true" alt="'.$data1['alt_deco'].'" style="z-index: 10;" /></a>';
}
//image fêtes et autres: deco2
$retour2= $bdd->prepare('SELECT * FROM `t_img_deco2` WHERE DATE_FORMAT(now(),"%m%d") BETWEEN DATE_FORMAT(debut,"%m%d") AND DATE_FORMAT(fin,"%m%d")') or die(print_r($bdd->errorInfo()));
$retour2->execute(array());
if($data2 = $retour2->fetch())
{
echo '<img src="images/decors/2/'. $data2['fichier_deco'].'" class="superpose" data-nozoom="true" alt="'.$data2['alt_deco'].'" style="z-index: 12;" /></a>';
}
//image évènement: deco3: cette fois on inclut l'année dans la date
$retour3= $bdd->prepare('SELECT * FROM `t_img_deco3` WHERE DATE_FORMAT(now(),"%Y%m%d") BETWEEN DATE_FORMAT(debut,"%m%d") AND DATE_FORMAT(fin,"%Y%m%d")') or die(print_r($bdd->errorInfo()));
$retour3->execute(array());
if($data3 = $retour3->fetch())
{
echo '<img src="images/decors/3/'. $data3['fichier_deco'].'" class="superpose" data-nozoom="true" alt="'.$data3['alt_deco'].'" style="z-index: 12;" /></a>';
} $connexion = null; ?>
</div>


En ce moment, puisque j'ai programmé, pour l'exemple, l'image de l'évènement QiQong entre le 2021-04-28 et le 2021-04-29, que le 1 mai n'est pas loin et que l'image du muguet est programmée entre le 28-04 et 05-05, et que nous sommes dans la période du printemps (21 mars -> 21 juin) , ça donne ceci:
http://lesamisducamgran.free.fr/index2.php

Si tu regardes le code source de la page, tu verras que l'image du printemps et du muguet, sont en-dessous de celle du QuiQong. Le 30 avril l'image du QiQong disparaitra, et le 5 mai, ce sera au tour du muguet de disparaitre...
on les visualise directement sur mon include: vu qu'il manque le css de superposition

Le seul truc que je ne comprends pas, c'est que le css du div id=decosbody,(style="padding:0px; position: relative") si je le mets dans le css du head, ça ne me donne pas la même chose que directement dans le div comme j'ai fait...

A part ça, y a un problème de cadrage du code sur memoclic, non ?

carpe diem
Bipbipcoyote Bipbipcoyote
3 438 contributions
Membre depuis le 06/03/2001
Envoyé le 28/04/2021 à 21:44


Bonjour,
oui souci de cadrage sur memo mais l'avantage, les lignes sont complètes, c'est plus lisible que s'il y avait un passage automatique à la ligne
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 503 contributions
Membre depuis le 01/03/2001
Envoyé le 29/04/2021 à 14:47


Bonjour,
Tu as raison.
(+)

carpe diem

Participer à cette discussion

« Retour sur la liste des messages de ce forum