J'essaie de sélectionner uniquement les enregistrements d'aujourd'hui à partir d'une table de base de données.
Actuellement j'utilise
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 les résultats en fonction de la date seulement?
utilisez DATE
et CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Je suppose en utilisant DATE
utilise encore INDEX.
Si vous souhaitez qu'un index soit utilisé et que la requête ne fasse pas d'analyse de table:
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
Pour montrer la différence que cela fait sur les plans d'exécution réels, nous allons tester avec un SQL-Fiddle (site extrêmement utile):
CREATE TABLE test --- simple table
( id INT NOT NULL AUTO_INCREMENT
,`timestamp` datetime --- index timestamp
, data VARCHAR(100) NOT NULL
DEFAULT 'Sample data'
, PRIMARY KEY (id)
, INDEX t_IX (`timestamp`, id)
) ;
INSERT INTO test
(`timestamp`)
VALUES
('2013-02-08 00:01:12'),
--- --- insert about 7k rows
('2013-02-08 20:01:12') ;
Essayons les 2 versions maintenant.
Version 1 avec DATE(timestamp) = ?
EXPLAIN
SELECT * FROM test
WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp)
ORDER BY timestamp ;
Explique:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test ALL
ROWS FILTERED EXTRA
6671 100 Using where; Using filesort
Il filtre toutes les (6671) lignes puis effectue un tri de fichier (ce n'est pas un problème car les lignes retournées sont peu nombreuses)
Version 2 avec timestamp <= ? AND timestamp < ?
EXPLAIN
SELECT * FROM test
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
Explique:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test range t_IX t_IX 9
ROWS FILTERED EXTRA
2 100 Using where
Il utilise une analyse range sur l'index, puis lit uniquement les lignes correspondantes de la table.
SELECT * FROM `table` WHERE timestamp >= CURDATE()
il est plus court, il n'est pas nécessaire d'utiliser 'ET horodatage <CURDATE () + INTERVAL 1 JOUR'
car CURDATE () renvoie toujours le jour actuel
De combien de façons pouvons-nous écorcher ce chat? Voici encore une autre variante.
SELECT * FROM table
WHERE DATE (FROM_UNIXTIME (timestamp
)) = '2015-11-18';
Il suffit de le lancer à une date:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
Si vous voulez comparer avec une date particulière, vous pouvez l'écrire directement comme ceci:
select * from `table_name` where timestamp >= '2018-07-07';
// ici l'horodatage est le nom de la colonne de type timestamp
ou
Pour récupérer la date du jour, la fonction CURDATE () est disponible, donc:
select * from `table_name` where timestamp >= CURDATE();
Cela pourrait être le plus facile à mon avis:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');