web-dev-qa-db-fra.com

Comment sélectionner les lignes ayant l'horodatage du jour actuel?

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?

83
Jackie Honson

utilisez DATE et CURDATE()

SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()

Je suppose en utilisant DATEutilise encore INDEX

voir le plan d'exécution sur la DEMO

157
John Woo

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.

47
ypercubeᵀᴹ
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 

Fonction MySQL CURDATE ()

7
Hamed Persia

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';

2
stefgosselin

Il suffit de le lancer à une date:

SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
1
MarcDefiant

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();
0
ViditAgarwal

Cela pourrait être le plus facile à mon avis:

SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
0
Jerry Jones