8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

Pour faire simple : j'ai une table qui contient un champs "date_appel" au format "DATETIME". Ainsi, j'ai le jour et l'heure de tous mes enregistrements. Bien

Maintenant, je souhaite effectuer une recherche par jour dans cette table en me servant du champs "date_appel". Mais voilà, si j'envoie une requête du type

SELECT * FROM matable WHERE date_appel='2010-12-14'


aucun enregistrement n'est trouvé, alors que j'ai bien des enregistrements correspondant à cette date.

Je me doute que le problème vient du fait qu'il y a une heure enregistrée dans ma table et que je ne lui fourni aucune précision à ce sujet. Mais tout de même, n'est il pas possible de faire ressortir tous les enregistrements réalisés sur une journée, quelquesoit l'heure ?

Merci à tous pour vos conseils Smiley smile
Modifié par volonia75 (14 Dec 2010 - 16:16)
Quelqu'un vient de me twitter la réponse :

SELECT * FROM matable WHERE DATE(date_appel) = '2010-12-14'


En fait "DATE(mon_champs)" permet de prévenir MySQL que l'on va faire une recherche de date sur ce champs là. Ainsi, on peut aussi faire une recherche par année sur ce même champs avec "YEAR(mon_champs)".

Bref, c'est tout simple, évidemment. J'ai cherché un bon moment avant d'avoir cette réponse !
volonia75 a écrit :

Bref, c'est tout simple, évidemment. J'ai cherché un bon moment avant d'avoir cette réponse !


Moi pas trop grâce à toi :d
merci
Bonjour,

cette solution est satisfaisante pour des tables modestes mais elle a un contre-effet qui peut-être gênant sur des grosses tables :

Quand on utilise des fonctions de dates pour faire des recherches, mySQL n'est plus capable d'utiliser les index qui auraient été mis sur cette colonne.

Faites un explain de votre requête, vous aurez un type=ALL, et key=NULL

Avec une requête du type
WHERE date_appel BETWEEN '2010-12-14' AND '2010-12-15'
, votre explain devient alors, type=range, key=votre index, ce qui devrait être beaucoup plus sympa.

En fait, en faisant DATE(date_appel), on ne prévient pas mySQL de quelque chose, mais on lui demande juste de faire le calcul de la date (certes, pas très compliqué) pour chacun des enregistrements. Imaginez un peu avec quelques millions de lignes Smiley cligne

Le BETWEEN, c'est pour l'instant la meilleure solution que j'ai trouvé, mais je reviens vers vous si je trouve mieux.