PHP comparaison de date... je craque

Le problème exposé dans ce sujet a été résolu.

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

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.

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.

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

+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

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. ^^

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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