J'essaie de sélectionner uniquement les enregistrements d'aujourd'hui à partir d'une table de base de données.
J'utilise actuellement
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Mais cela prend des résultats pour les dernières 24 heures, et j'en ai besoin pour ne sélectionner que les résultats d'aujourd'hui, en ignorant l'heure. Comment puis-je sélectionner des résultats en fonction de la date uniquement?
Using where; Using index
?timestamp
(etdate
comme dans mon cas) est un mot réservé MySQLSi vous souhaitez qu'un index soit utilisé et que la requête n'effectue pas d'analyse de table:
Pour montrer la différence que cela fait sur les plans d'exécution réels, nous allons tester avec un SQL-Fiddle (un site extrêmement utile):
Essayons les 2 versions maintenant.
Version 1 avec
DATE(timestamp) = ?
Explique:
Il filtre toutes les (6671) lignes puis effectue un tri de fichiers (ce n'est pas un problème car les lignes renvoyées sont peu nombreuses)
Version 2 avec
timestamp <= ? AND timestamp < ?
Explique:
Il utilise une analyse de plage sur l'index , puis lit uniquement les lignes correspondantes de la table.
la source
INDEX t_IX (timestamp, id)
pourrait (devrait?) être justeINDEX t_IX (timestamp)
, comme la clé primaire est impliquée dans l'index. ou y a-t-il une raison pour laquelle je ne comprends pas pour faire ça? Je l'ai essayé dans sql-fiddle et j'ai vu le même (meilleur) plan d'exécutionid
(car c'est le PK et donc l'index clusterisé de la table) est quand même ajouté dans l'index. Donc, cela ne fait pas de mal de l'ajouter explicitement (et cela peut attraper certains angles morts de l'optimiseur). Ce n'est certainement pas pertinent dans ce cas / requête.timestamp < CURDATE() + INTERVAL 1 DAY
est nécessaire?il est plus court, il n'est pas nécessaire d'utiliser 'AND timestamp <CURDATE () + INTERVAL 1 DAY'
car CURDATE () renvoie toujours le jour actuel
Fonction MySQL CURDATE ()
la source
De combien de façons pouvons-nous écorcher ce chat? Voici encore une autre variante.
SELECT * FROM
table
WHERE DATE (FROM_UNIXTIME (timestamp
)) = '18/11/2015';la source
Si vous souhaitez comparer avec une date particulière, vous pouvez l'écrire directement comme:
// ici l'horodatage est le nom de la colonne ayant le type comme horodatage
ou
Pour récupérer la date du jour, la fonction CURDATE () est disponible, donc:
la source
Envoyez-le simplement à une date:
la source
Cela pourrait être le plus simple à mon avis:
la source
Ou vous pouvez utiliser l'alternative CURRENT_DATE, avec le même résultat:
Exemples tirés de database.guide
la source
Sur Visual Studio 2017, en utilisant la base de données intégrée pour le développement, j'ai eu des problèmes avec la solution actuelle donnée, j'ai dû changer le code pour le faire fonctionner car il a généré l'erreur que DATE () n'était pas une fonction intégrée.
Voici ma solution:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
la source