Wie vergleiche ich in einer SQL-Anweisung ein als TIMESTAMP gespeichertes Datum mit einem Datum im Format JJJJ-MM-TT?
Ex.: SELECT * FROM table WHERE timestamp = '2012-05-05'
Ich möchte, dass diese Abfrage alle Zeilen mit Zeitstempel am angegebenen Tag zurückgibt, aber nur Zeilen mit Zeitstempel Mitternacht.
Vielen Dank
quelle
Wie von einigen vorgeschlagen,
DATE(timestamp)
wenden Sie bei der Verwendung eine Manipulation auf die Spalte an und können sich daher nicht auf die Indexreihenfolge verlassen.Die Verwendung
BETWEEN
wäre jedoch nur dann zuverlässig, wenn Sie die Millisekunden einbeziehen. Im BeispielzeitstempelBETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
schließen Sie Datensätze mit einem Zeitstempel zwischen2012-05-05 23:59:59.001
und aus2012-05-05 23:59:59.999
. Selbst diese Methode weist jedoch aufgrund der Genauigkeit der Datentypen einige Probleme auf. Gelegentlich werden 999 Millisekunden aufgerundet.Das beste zu tun ist:
SELECT * FROM table WHERE date>='2012-05-05' AND date<'2012-05-06'
quelle
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' AND timestamp <= '2012-05-05 23:59:59'
quelle
Verwenden Sie eine Konvertierungsfunktion von MYSQL:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
Das sollte funktionieren
quelle
Als ich dies recherchierte, dachte ich, es wäre schön, die ZWISCHEN-Lösung so zu ändern, dass ein Beispiel für ein bestimmtes nicht statisches / Zeichenfolgen-Datum, sondern ein variables Datum oder ein heutiges wie das heutige angezeigt wird
CURRENT_DATE()
. Dies wird den Index für die Spalte log_timestamp verwenden.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));
Ich habe die Sekunden / Mikrosekunden gemacht, um den Fall um 12 Uhr am nächsten Tag zu vermeiden. Sie können jedoch auch "INTERVAL" 1 TAG "über Vergleichsoperatoren durchführen, um einen leserfreundlicheren Nicht-ZWISCHEN Ansatz zu erhalten:
SELECT * FROM some_table WHERE log_timestamp >= timestamp(CURRENT_DATE()) AND log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));
Beide Ansätze verwenden den Index und sollten VIEL schneller arbeiten. Beide scheinen gleich schnell zu sein.
quelle
Wenn Sie SQL-Parameter zum Ausführen der Abfrage verwenden, ist dies hilfreich
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
quelle
Als ich Ihre Frage las, dachte ich, Sie wären in Oracle DB, bis ich das Tag 'MySQL' sah. Für Leute, die mit Oracle arbeiten, ist hier der Weg:
SELECT * FROM table where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
quelle
Verwenden
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
quelle