Besoin aide, requête SQL avec une date

Petit nouveau ! | 3 Messages

05 mai 2009, 14:44

Bonjour, je souhaite effectuer une requête relativement simple :D
Mais malgré plusieurs heures a chercher à gauche et a droite sur divers tuto et forums je n'ai malheureusement toujours pas trouvé la solution, c'est pourquoi je me permet de venir demander un peu d'aide auprès de vous, d'avance un grand merci !!!

1. J'aimerais que ma requête me récupère dynamiquement dans le echo tout à la fin (echo $donnees3['entrees_NB']) le nombre de news postée par une certaine personne (variable $pseudo) lors des 7 derniers jours...

2. en mettant deux dates fixe dans mon BETWEEN (DATE BETWEEN '28.04.09 ' and '05.05.09') il me sort un résultat erroné... je pense que c'est le format de la date dans ma base de donnée (
les dates dans mon champ DATE sont insérées dans ce format : 05.05.09) qui pose problème, comment faire pour que ma requête fonctionne (et sans devoir changer de format de date dans la base de donnée) ?

Code : Tout sélectionner

$retour3 = mysql_query("SELECT COUNT(*) AS entrees_NB FROM news Where PSEUDO ='".$pseudo."' AND DATE BETWEEN 'DATE DU JOUR -7 ' and '".date("d.m.y")."' "); $donnees3 = mysql_fetch_array($retour3); echo $donnees3['entrees_NB']

D'avance un grand merci pour la précieuse aide que vous pourrez me fournir
Salutations à tous !

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.9.5 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mar 05 Mai 2009 à 14:42 -- Version du serveur: 5.0.45 -- Version de PHP: 5.2.8 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: '' -- -- -------------------------------------------------------- -- -- Structure de la table 'news' -- CREATE TABLE news ( ID int(11) NOT NULL auto_increment, CONTENU text NOT NULL, SUPPLEMENT text NOT NULL, `DATE` varchar(10) NOT NULL, PSEUDO varchar(100) NOT NULL, PUBLIE int(11) NOT NULL default '0', EMAIL varchar(100) NOT NULL, `SOURCE` varchar(255) NOT NULL, POSITION int(11) NOT NULL, `TYPE` int(1) NOT NULL default '3', PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
[/code]

ViPHP
AB
ViPHP | 5818 Messages

05 mai 2009, 17:52

Si tu veux faire du tri sur les dates il faut que ton champs date soit au format date ou datetime et que les dates soient enregistrées au format date.
http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html
Modifié en dernier par AB le 06 mai 2009, 18:32, modifié 1 fois.

Petit nouveau ! | 3 Messages

05 mai 2009, 18:14

merci pour la réponse, je sais que le format des dates est ""faux" mais beaucoup de fonctions et pages repose sur ce format, changer cela m'obligerait a modifier de trop nombreuses pages ce qui ne m'arrange pas du tout...

c'est pour ça que ma question était : comment faire pour que ma requête fonctionne et sans devoir changer de format de date dans la base de donnée ?

il doit bien y avoir une solution en explosant la date ou quelque chose de ce genre ?
Comment faire ? Merci !

ViPHP
AB
ViPHP | 5818 Messages

05 mai 2009, 19:31

Ben oui mais normalement on enregistre au format date pour la bdd et ensuite on transforme au format voulu pour l'affichage.
Là ça va pas être facile, on ne peut pas utiliser directement des fonctions php dans une requête mysql... Les fonctions mysql sur les chaines de caractères sont ici http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html . ..peut-être un LOCATE ...
Peut-être aussi un premier tri avec ces fonctions puis un second en php. Enfin ça risque de pourrir les performances mais bon si tu ne peux pas faire autrement...

Petit nouveau ! | 3 Messages

11 mai 2009, 19:37

bonjour, pour finir j'ai changé le format de mes dates, qui sont désormais au format 2009-05-11 c'était la meilleure solution... j'ai aussi suivant tes conseils rennomé le champ DATE par DATE_AJOUT


j'aurais une petite question encore:

j'ai ma requête pour afficher les dates des 7 derniers jours :

Code : Tout sélectionner

AND n.date_ajout >= '".date('Y-m-d', time()-7*24*3600)."'
mais comment afficher par exemple les dates de février 2009 ?
Je pensai a quelque chose comme cela mais c'est pas vraiment juste apparemment :oops:

Code : Tout sélectionner

AND n.date_ajout= MONTH(DATE_AJOUT)='02' and YEAR(DATE_AJOUT)='2009'
qqun peut m'aider svp ?
Merci

ViPHP
AB
ViPHP | 5818 Messages

12 mai 2009, 06:05

Code : Tout sélectionner

AND n.date_ajout= MONTH(DATE_AJOUT)='02' and YEAR(DATE_AJOUT)='2009'
qqun peut m'aider svp ?
Merci
à quoi sert le ' n.date_ajout= ' ? Pour les dates de février 2009

Code : Tout sélectionner

WHERE MONTH(DATE_AJOUT)='02' and YEAR(DATE_AJOUT)='2009'
devrait fonctionner.
Sinon les 7 dernier jours de février 2009 sont ceux qui précèdent de 7 jours le 1 mars 2009. Ou tu pourrais ajouter aussi à ta requête AND DAY(DATE_AJOUT) > 21 mais cela t'impose de connaitre le nombre de jours du mois de février 2009.

ViPHP
AB
ViPHP | 5818 Messages

13 mai 2009, 03:08

Alors c'est résolu ?

Sinon pour coder la recherche sur les 7 derniers jours du mois de février 2009 tu peux faire

Code : Tout sélectionner

WHERE DATE_AJOUT BETWEEN DATE_SUB( '2009-03-01', INTERVAL 8 DAY ) AND DATE_SUB( '2009-03-01', INTERVAL 1 DAY )

Note : c'est mieux d'avoir mis DATE_AJOUT à la place de DATE car c'est un mot réservé par de nombreux système de base de donnée, ton système est maintenant mieux portable. Cependant, dans sa grande bonté, mysql supporte néanmoins un champ nommé date pour les tables. Mais outre des problèmes de portabilité, cela peut néanmoins prêter à confusion et c'est pour ces raisons que l'on déconseille de le faire même si cela peut fonctionner avec mysql.