Select tout ce qui se termine dans les 24 heures

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 17:42

Salut,

j'aimerais donc faire un SELECT sur tout les enregistrements dont la validité (de 30 jours) s'éteint dans les 24 heures.

J'ai évidemment pensé à un SELECT tagada from Table WHERE TO_DAYS(NOW()) - TO_DAYS(date_an) > 28 and TO_DAYS(NOW()) - TO_DAYS(date_an) < 31, mais...

a) ça me donnerait jusqu'à 2 jours d'intervalle
b) il y a peu de chance que ça tienne compte des heures :cry:

J'ai aussi pensé à utiliser les INTERVAL, mais quelle serait la fonction des heures (Interval + 24) ?

Le tout sachant que j'aurais probablement des centaines voire des milliers d'enregistrements à filtrer lors de la requête, donc hors de question de tester en boucle !!! :lol:

Une suggestion simple ?
Modifié en dernier par Overseas le 27 sept. 2005, 19:29, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 17:56

avec ça peut-être :

Code : Tout sélectionner

SELECT tagada FROM Table WHERE DATE_ADD(<champ_date>,INTERVAL 24 HOUR) <= DATE_ADD(NOW(), INTERVAL 24 HOUR)
tu as la liste des valeurs utilisables pour les intervalles dans la doc, et les heures sont dedans :
http://dev.mysql.com/doc/mysql/fr/date- ... tions.html

(après la fonction DATE_ADD)

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 18:04

Merci pour la réponse très rapide ! =D>

Je vais tester cela...
Oui, je connais bien l'adresse des docs, mais sans exemple concret, c'est parfois un peu dur...! :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 18:12

il y a un date_add de trop

puisque c'est pour récupérer tous les enregistrement dont la date est inférieure à maintenant+24h, ce serait plutôt ça :

Code : Tout sélectionner

SELECT tagada FROM Table WHERE<champ_date> <= DATE_ADD(NOW(), INTERVAL 24 HOUR)

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 18:19

Possible... mais pour l'instant cela ne marche pas... :oops: (de ma faute probablement :wink: )

Attention, j'ai en fait mis :
$listhese = mysql_query("select code_an, date_an, mbemett_an, rubrique_an, titre_an, sens_an, cp_an, verified_an, photo_an, code_sr, rubrique_sr, titre_sr, depart_an from annonce, sousrub
where rubrique_an = code_sr and date_an+2592000 <= DATE_ADD(NOW(), INTERVAL 24 HOUR)
order by date_an desc limit $transrup, $audelamax") ;

...vu que la date_an est la date d'insertion avec validité de 30 jours.
---> 3600 * 24 * 30 = 2592000

Il me restitue l'ensemble des enregistrements...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 18:36

ok, je croyais que tu avais déjà stocké la date d'expiration

quel est le format de la date de création stockée ?
si c'est bien une colonne de type date, pourquoi ne pas utiliser la même fonction date_add pour ajouter 30 jours, plutôt que ce calcul ?

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 18:40

quel est le format de la date de création stockée ?
datetime bien entendu.
si c'est bien une colonne de type date, pourquoi ne pas utiliser la même fonction date_add pour ajouter 30 jours, plutôt que ce calcul ?
Parce que les annonces sont stockées à la minute près, et non au jour près...

Je suis en train de tester ce genre de chose :
WHERE date_an+2592000 <= DATE_ADD(NOW()) and date_an+2505600 >= DATE_ADD(NOW())

2592000 = 30 jours
2505600 = 29 jours
ce qui pourrait bien convenir... :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 18:44

il prend correctement ce calcul ?
date_an+2592000
moi à ta place je resterai sur le date_add et les intervalles :P

mais je ne comprends pas bien, si tu ajoutes 30 jours à cette date
2005-05-04 15:12:29
tu devrais retomber là-dessus : 2005-06-03 15:12:29

alors pourquoi t'embêter à rajouter un nombre de secondes ?

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 18:58

Le calcul n'est pas encore au point... je devrais avoir 2 enrg. en retour, il ne m'en met plus aucun... avec en plus une erreur classique style :
supplied argument is not a valid MySQL result resource
comme s'il n'avait pas compris la requête... :lol:

Si effectivement et de façon certaine il tient compte des heures & minutes dans ta suggestion, effectivement 30 jours seraient bien...
mais ça m'étonnerait que date_an + 30 soit plus adapté que date_an + 2592000... :wink:

Je dois pas être bien loin de la soluce... :-k

Je viens d'essayer avec :
date_an+30 <= TO_DAYS(NOW()) and date_an+29 >= TO_DAYS(NOW())

Plus d'erreur, mais il ne renvoie aucun enregistrement... :roll:
Bon... je vais laisser reposer deux minutes ! :boire4:

Encore merci pour la contribution ! :merci:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 19:12

je ne parlais pas de "date_an + 30" mais de date_add(date_an, INTERVAL 30 DAY)
car effectivement le calcul direct, datetime + nombre me parait un peu léger...(d'où mon interrogation au début de mon précédent message)

mais tu as une fonction qui te donne une date dans le futur, avec le pas que tu veux : secondes, jours, mois... pourquoi ne pas l'utiliser ?

ce qui donnerait :

Code : Tout sélectionner

SELECT tagada FROM Table WHERE DATE_ADD(date_an, INTERVAL 30 DAY) <= DATE_ADD(NOW(), INTERVAL 24 HOUR)
donc je crois que ceci correspond à ce que tu cherches à faire :
obtenir tous les enregistrements dont la date de création + 30 jours sera expirée dans 24h

non ?
et au passage, teste d'abord directement ta requête sur la base, sans passer par PHP, mais via phpMyAdmin par exemple
ça t'évitera de gérer le coté PHP pour le moment, et de l'attaquer avec une requête valide ;)

Eléphanteau du PHP | 30 Messages

27 sept. 2005, 19:21

obtenir tous les enregistrements dont la date de création + 30 jours sera expirée dans 24h
Exact...
et au passage, teste d'abord directement ta requête sur la base, sans passer par PHP, mais via phpMyAdmin par exemple
ça t'évitera de gérer le coté PHP pour le moment, et de l'attaquer avec une requête valide ;)
Ok. Bonne idée.

Edit : bon, ben... ça marche !
Ton truc est le bon, c'est bien un mix d'interval 30 day et 24 hour...! =D>

Honnêtement, j'aurais eu beaucoup de mal à trouver !
Merci ! :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 sept. 2005, 19:37

Edit : bon, ben... ça marche !
Ton truc est le bon, c'est bien un mix d'interval 30 day et 24 hour...! =D>

Honnêtement, j'aurais eu beaucoup de mal à trouver !
Merci ! :D
Pourtant, tu avais pensé a INTERVAL dès le début, pour les 24h...
et c'est ça qui m'étonnait, que tu ne veuilles pas le réutiliser pour les 30 jours :lol: