MySQL Select Date égale à aujourd'hui

96

J'essaie d'exécuter une instruction mysql select où elle regarde la date du jour et ne renvoie que les résultats qui se sont inscrits ce jour-là. J'ai actuellement essayé ce qui suit, mais cela ne semble pas fonctionner.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

J'ai modifié ma SELECTdéclaration en ce sens, merci les gars.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

Jako
la source
il semble que ce signup_datesoit le champ datetime
Sergii Stotskyi
@Serjio Oui, il s'agit actuellement d'un champ datetime.
Jako
quel est le type de données signup_dates'il contient l'heure, alors vous voudrez utiliser le date_format dans la WHEREclause pour dépouiller l'heure pour qu'elle corresponde àCURDATE()
Taryn
@bluefeet merci, j'ai modifié mon script. Cela semble fonctionner, mais quand il n'y a pas de résultats. mysql_num_rowsn'affiche pas 0. Juste un blanc.
Jako

Réponses:

197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
la source
est-il nécessaire d'utiliser DATE () même si le champ est de type Date?
rashidnk
2
@rashidnk Non. Bien qu'il n'ait pas dit clairement dans la question, le champ est apparemment de type DATETIME.
Barmar
2
Bien que cette solution soit tout à fait correcte, elle n'est pas bien mise à l'échelle (ne peut pas utiliser un index sur signup_date, même si un tel index existe). Préférez la solution de Serjio .
RandomSeed
ou si rechercher à une date particulière, avec l'index également utilisé `` `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM utilisateurs où signup_date> = '2017-08 -30 00:00:00 'et signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M Asok
3
@SumitMAsok Mieux à utiliser < '2017-08-31 00:00:00'si vous utilisez une version de MySQL avec des millisecondes.
Barmar
29

Cette requête utilisera l'index si vous l'avez pour le signup_datechamp

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)
Sergii Stotskyi
la source
Les votes négatifs à cette réponse sont absurdes. C'est en fait l'approche préférée, car cette requête serait en mesure de tirer parti d'un index signup_date, contrairement à d'autres approches.
RandomSeed
2
@RandomSeed L'idée générale de tester signup_dateentre deux heures est correcte, mais les heures ne le sont pas. Il doit être compris entre 00:00et 23:59:59à la date actuelle.
Barmar
Eh bien, l'intervalle de dates était également faux>. <Les votes négatifs n'étaient pas si absurdes après tout.
RandomSeed
Cette requête est bien plus performante (grâce à l'index). Le a WHERE DATE(signup_date) = CURDATE()pris mon serveur ~ 50 ms, celui-ci ici 0,8 ms.
Kai Noack le
13

On dirait que vous devez ajouter le formatage au WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

Voir SQL Fiddle avec démo

Taryn
la source
1

Vous pouvez utiliser le CONCATavec CURDATE()pour toute la durée de la journée, puis filtre en utilisant l' BETWEENen WHEREétat:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
Tanakom Talawat
la source