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
la source
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
BETWEEN
ne 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 entre2012-05-05 23:59:59.001
et2012-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'
la source
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' AND timestamp <= '2012-05-05 23:59:59'
la source
Utilisez une fonction de conversion de MYSQL:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
Cela devrait fonctionner
la source
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.
la source
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')
la source
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');
la source
Utilisation
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
la source