web-dev-qa-db-fra.com

Tous les enregistrements MySQL d'hier

Quel est le moyen le plus efficace d’obtenir tous les enregistrements dont le champ date/heure se situe quelque part entre hier à 00:00:00 et hier à 23:59:59?

Table:

id    created_at
1     2016-01-19 20:03:00
2     2016-01-19 11:12:05
3     2016-01-20 03:04:01

Supposons qu'hier, c'était le 19/01/2016, dans ce cas, tout ce que je voudrais retourner, ce sont les lignes 1 et 2.

7
eComEvo

Puisque vous ne recherchez que la partie date, vous pouvez comparer facilement celle-ci en utilisant la fonction DATE() de MySQL . Notez que si vous avez un très grand nombre d'enregistrements, cela peut être inefficace; Les avantages d'indexation sont perdus avec la valeur dérivée de DATE().

SELECT * FROM table WHERE DATE(created_at) = DATE(NOW() - INTERVAL 1 DAY);
28
miken32

Vous pouvez toujours utiliser l'index si vous dites 

SELECT * FROM TABLE
WHERE CREATED_AT >= CURDATE() - INTERVAL 1 DAY
  AND CREATED_AT < CURDATE();
6
Alan Hadsell

Vous pouvez utiliser subdate pour indiquer «hier» et date() pour indiquer que vous souhaitez des enregistrements contenant uniquement la partie date de la colonne. Alors:

SELECT *
FROM tablename
WHERE DATE(created_at) = SUBDATE(CURRENT_DATE(), INTERVAL 1 DAY)
1
Anthony

Ici est la même question avec une réponse. Pour résumer la réponse pour vous, utilisez subdate () comme suggéré par Sajmon.

subdate(currentDate, 1)

en utilisant votre table, il devrait être.

select *
from tablename
where created_at between subdate(CURDATE(), 1)
and date (now() )
1
Wilnar Vincent