Comment comparer les dates d'horodatage avec le paramètre de date uniquement dans MySQL?

88

Dans une instruction SQL, comment comparer une date enregistrée sous TIMESTAMP avec une date au format AAAA-MM-JJ?

Ex.: SELECT * FROM table WHERE timestamp = '2012-05-05'

Je veux que cette requête renvoie toutes les lignes ayant un horodatage dans le jour spécifié, mais elle ne renvoie que les lignes ayant un horodatage de minuit.

Merci

Michael
la source

Réponses:

144

Vous pouvez utiliser la DATE()fonction pour extraire la partie date de l'horodatage:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

Cependant, si vous avez un index sur la colonne d'horodatage, ce serait plus rapide car il pourrait utiliser un index sur la colonne d'horodatage si vous en avez un:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
Marcus Adams
la source
5
Grâce à un petit test que je viens de faire, j'ai trouvé que l'utilisation de BETWEEN était plus rapide d'un facteur 10X Juste pour
info
7
 WHERE cast(timestamp as date) = '2012-05-05'
juergen d
la source
6

Comme certains l'ont suggéré, en utilisant, DATE(timestamp)vous appliquez une manipulation à la colonne et vous ne pouvez donc pas vous fier à l'ordre des index.

Cependant, l'utilisation BETWEENne serait fiable que si vous incluez les millisecondes. Dans l'exemple d'horodatage, BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'vous excluez les enregistrements avec un horodatage compris entre 2012-05-05 23:59:59.001et 2012-05-05 23:59:59.999. Cependant, même cette méthode pose certains problèmes, en raison de la précision des types de données. Parfois, 999 millisecondes sont arrondies.

La meilleure chose à faire est:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'
Tom Kitson
la source
5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'
Cfreak
la source
2

Utilisez une fonction de conversion de MYSQL:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Cela devrait fonctionner

adrien
la source
1

Pendant que je recherchais cela, j'ai pensé qu'il serait bien de modifier la solution BETWEEN pour afficher un exemple pour une date non statique / chaîne particulière, mais plutôt une date variable, ou celle d'aujourd'hui telle que CURRENT_DATE(). Cela utilisera l'index sur la colonne log_timestamp.

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

J'ai fait les secondes / microsecondes pour éviter le cas de 12h le lendemain. Cependant, vous pouvez également faire `` INTERVAL '1 DAY' 'via des opérateurs de comparaison pour une approche non-BETWEEN plus conviviale:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

Ces deux approches utiliseront l'index et devraient fonctionner BEAUCOUP plus rapidement. Les deux semblent être tout aussi rapides.

Asnyder
la source
0

Si vous utilisez des paramètres SQL pour exécuter la requête, cela serait utile

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
devesh
la source
0

Quand j'ai lu votre question, je pensais que vous étiez sur Oracle DB jusqu'à ce que j'ai vu la balise «MySQL». Quoi qu'il en soit, pour les personnes travaillant avec Oracle, voici le moyen:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
KeyMaker00
la source
0

Utilisation

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 
Muhammad Fahad
la source