2009-12-19 5 views
0

Ma table utilise un datetime (YYYY-MM-DD HH:MM:SS) et j'ai besoin d'afficher les entrées d'aujourd'hui.comment tester date et datetime avec mysql

mon code est seulement:

SELECT * 
FROM  table 
WHERE date = '$date' 
ORDER BY score DESC 

avec

$date = date("Y-m-d"); 
bien

, comme prévu cela ne fonctionne pas: | vous les gars avez une solution ici?

Répondre

8

Après de Pascal Martin, vous pourriez extraire la partie date du champ date + heure:

SELECT * FROM table WHERE DATE(date) = '2009-12-19' 

Source: MySQL - Date and Time Functions

Soyez conscient cependant que cette requête ne sera pas utiliser un index sur votre date + champ de temps, si vous en aurez un. (Stack Overflow: How does one create an index on the date part of DATETIME field in MySql)

+0

c'est la meilleure façon de le faire =) THX beaucoup –

+1

Si je ne me trompe pas, avec une solution comme celle-ci, dans laquelle il y a un calcul sur la colonne "date", que le calcul/la conversion devra être effectué sur chaque ligne de la table, ce qui gâchera la possibilité d'utiliser l'index qui aurait pu être défini dans la colonne "date". –

+0

@Pascal: Oui, je le pense. J'ai ajouté la clarification dans ma réponse ... En attendant, je vérifie comment MySQL gère cela, par curiosité. –

3

Votre date est "2009-12-19" (ou quelque chose comme ça, selon le jour), qui est interprété comme "2009-12-19 00:00:00".

Dans votre base de données, vous n'avez probablement aucune date qui est exactement égale à celle-ci, à la seconde: vos dates sont comme "2009-12-19 12:15:32".

Une solution est de comparer comme ceci:

select * 
from table 
where date >= '2009-12-19' 
    and date < '2009-12-20' 

qui sera interprété comme:

select * 
from table 
where date >= '2009-12-19 00:00:00' 
    and date < '2009-12-20 00:00:00' 

Et, si vous ne voulez pas faire le calcul pour obtenir la date de la après la date, vous pouvez utiliser la fonction adddate:

select * 
from table 
where date >= '2009-12-19' 
    and date < adddate('2009-12-19', interval 1 day) 

Ainsi, dans votre cas, quelque chose comme cela devrait faire l'affaire:

select * 
from table 
where date >= '$date' 
    and date < adddate('$date', interval 1 day) 
order by score desc 
+0

n'est pas là une plus belle option pour écrire cela? thx pour les conseils de toute façon, cela aurait pris un peu de réflexion –

+1

Hu; nous ne sommes pas d'accord sur la définition de "beau", je suppose - au moins, je ne pense pas que cela ressemble "laid", mais, bien ... ;; un avantage de cette solution est qu'elle devrait utiliser l'index que vous avez dans la colonne "date", si vous en avez sur celle-ci (et peut-être vous devriez) - alors qu'une solution qui convertit la colonne "date" ou fait un calcul il supprimera l'abolition pour utiliser un index. –

+0

que voulez-vous dire par index? et par beau, je trouve la solution de Daniel Vassallo plus propre –

0

Vous voulez probablement formater les données lorsque vous le sélectionnez:

SELECT *, DATE_FORMAT(date, '%Y-%m-%d') AS dateformat FROM table 
WHERE dateformat = '$date' ORDER BY score DESC 
+0

ses spectacles unknows nom de colonne dateformat –

0

Vous comparez expression_dateheure et la date, c'est pourquoi sa ne fonctionne pas. Utilisez la méthode Date() pour renvoyer la partie date de datetime, puis effectuez la comparaison. WHERE DATE (date) = '$ date' devrait faire l'affaire. Vous devrez peut-être utiliser des alias pour gérer cette collision de noms.