PHP comparaison de date... je craque

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut à tous,

Aprés avoir cherché une bonne partie de l’aprem je viens demander de l’aide :colere2:.

J’ai une table comme ci-dessous :Image utilisateur

Elle stock tous les événements ou infos à publier ensuite dans un agenda.J’essaye de gérer les plages d’horaires, donc sur plusieurs jours. C’est pour cela qu’il y a une date de début et de fin. Mais en vain total !!

J’affiche cela à l’aide de <td> en html pour l’agenda.

Voila comment je fonctionne pour afficher les éléments de l’agenda, je récupère la date du jour

1
$dateJour = $an.'-'.$mois.'-'.$i.' 00:00:00';

Puis je fais ma requête :

1
$requete = $pdo->query('SELECT id, nom, type, description FROM nounou_agenda WHERE date_debut >= "'.$dateJour.'" AND date_fin <= "'.$dateJour.'" AND id_nounou = "'.intval($_SESSION['id_nounou']).'"');

Mais bien sur cela ne fonctionne pas.... La version qui fonctionne "le mieux" mais ne prends pas du tout en compte le mois et je ne comprends pas pourquoi :

1
$requete = $pdo->query('SELECT id, nom, type, description FROM nounou_agenda WHERE DAY(date_debut) <= "'.$i.'" AND DAY(date_fin) >= "'.$i.'" AND MONTH(date_debut) <= "'.$mois.'" AND MONTH(date_fin) >= "'.$mois.'" AND YEAR(date_debut) <= "'.$an.'" AND YEAR(date_fin) >= "'.$an.'" AND id_nounou = "'.intval($_SESSION['id_nounou']).'"');

Je dois passer à coté d’un truc mais je ne sais quoi …

Merci d’avance pour votre aide.

Florian

+0 -0
Auteur du sujet

EtienneR -> merci pour l’astuce. Je viens d’intégrer la fonction :

1
$requete = $pdo->query('SELECT id, nom, type, description FROM nounou_agenda WHERE STR_TO_DATE(date_debut,"%Y-%m-%d") >= "'.$dateJour.'" AND STR_TO_DATE(date_fin,"%Y-%m-%d") <= "'.$dateJour.'" AND id_nounou = "'.intval($_SESSION['id_nounou']).'"');

Mais cela ne fonctionne pas.

WinXaito -> oui je pense que je vais essayer avec les timestamp si je ne trouve pas d’autre solution à explorer.

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Les colonnes date_debut et date_fin sont-elles bien au format DATETIME (tu peux vérifier depuis l’onglet Structure de phpmyadmin) ? Si elles sont au format string, c’est normal que ça fasse n’importe quoi.

Si ce n’est pas ça, est-ce que tu peux nous afficher le contenu type de $dateJour?

Par ailleurs, tu peux simplifier ta requête avec le mot-clef BETWEEN, une fois que tu es sûr que tout le reste fonctionne :

1
2
<?php
$requete = $pdo->query('SELECT id, nom, type, description FROM nounou_agenda WHERE ("' . $dateJour . '" BETWEEN date_debut AND date_fin) AND id_nounou = ' . intval($_SESSION['id_nounou']));

J’ai pas testé, mais normalement ça marche.

D’ailleurs, est-ce que tu as vraiment besoin du DATETIME ? J’ai l’impression que tu pourrais te contenter de DATE.

+0 -0
Auteur du sujet

Salut melepe,

Yeah !!! cela venait de la requête puisque j’ai copié ta requête avec le between et cela fonctionne parfaitement ;-).

Pour répondre à ta question oui besoin du DATETIME car j’affiche aussi l’heure à d’autres endroits.

Merci beaucoup à tous de votre aide.

Florian

Édité par arglow

+0 -0

Salut,

Une petite question par rapport aux "-1" sur la proposition des timestamp :

Je me suis frotté à un problème similaire l’année dernière et j’avais finalement adopté les timestamp.
Pourquoi ne pas choisir cette solution ? Cela pose d’autres problèmes ? (Heures d’été / hiver, autres ?)

Ou tout simplement les "-1" pour cette proposition étaient là car l’auteur du sujet ne les utilisent pas à l’origine dans son problème ?

Merci d’avance pour vos réponses @artragis, @vibrice et / ou @La source :)

ShiiFu

+1 -0

Finalement, à tête reposée je m’aperçois de ce qui n’allait pas dans ta requête :
WHERE date_debut >= "'.$dateJour.'" AND date_fin <= "'.$dateJour.'"
recherche les entrées telles que date_fin <= dateJour <= date_debut, alors qu’il faudrait l’inverse. ^^

+0 -0
Auteur du sujet

melepe, je t’avoue que par désespoir j’ai essayé dans tous les sens mais pas comme ça pour les opérateurs. Je vais faire le test, juste pour confirmer et je te dirai ça.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte