wake-up-neo.com

So wählen Sie Zeilen mit dem Zeitstempel des aktuellen Tages aus

Ich versuche, nur die heutigen Datensätze aus einer Datenbanktabelle auszuwählen.

Momentan benutze ich

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));

Dies erfordert jedoch Ergebnisse für die letzten 24 Stunden, und ich brauche nur die Ergebnisse von heute auswählen und die Zeit ignorieren. Wie kann ich Ergebnisse nur basierend auf dem Datum auswählen?

83
Jackie Honson

verwenden Sie DATE und CURDATE()

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

Ich denke schon mit DATEverwendet immer noch INDEX

siehe Ausführungsplan auf der DEMO

157
John Woo

Wenn Sie einen Index verwenden möchten und die Abfrage keinen Tabellenscan durchführen soll:

WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY

Um den Unterschied zwischen den tatsächlichen Ausführungsplänen zu zeigen, testen wir mit SQL-Fiddle (eine äußerst hilfreiche Site):

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

Lass uns jetzt die 2 Versionen ausprobieren.


Version 1 mit DATE(timestamp) = ?

EXPLAIN
SELECT * FROM test 
WHERE DATE(timestamp) = CURDATE()            ---  using DATE(timestamp)
ORDER BY timestamp ;

Erklären Sie:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   ALL

ROWS  FILTERED  EXTRA
6671  100       Using where; Using filesort

Es filtert alle (6671) Zeilen und führt dann einen Filesort aus (das ist kein Problem, da es nur wenige zurückgegebene Zeilen gibt).


Version 2 mit timestamp <= ? AND timestamp < ?

EXPLAIN
SELECT * FROM test 
WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;

Erklären Sie:

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

Es verwendet einen range-Scan für den Index und liest dann nur die entsprechenden Zeilen aus der Tabelle.

47
ypercubeᵀᴹ
SELECT * FROM `table` WHERE timestamp >= CURDATE()

es ist kürzer, es ist nicht notwendig, 'AND timestamp <CURDATE () + INTERVAL 1 DAY' zu verwenden.

weil CURDATE () immer den aktuellen Tag zurückgibt 

MySQL CURDATE () - Funktion

7
Hamed Persia

Wie viele Möglichkeiten gibt es für diese Katze? Hier ist noch eine andere Variante.

SELECT * FROM table WHERE DATE (FROM_UNIXTIME (timestamp)) = '2015-11-18';

2
stefgosselin

Lege es einfach auf ein Datum:

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

Wenn Sie mit einem bestimmten Datum vergleichen möchten, können Sie es direkt wie folgt schreiben:

select * from `table_name` where timestamp >= '2018-07-07';

// Hier ist der Zeitstempel der Name der Spalte mit dem Typ als Zeitstempel

oder 

Zum Abrufen des heutigen Datums steht die CURDATE () - Funktion zur Verfügung, also:

select * from `table_name` where timestamp >=  CURDATE();
0
ViditAgarwal

In Visual Studio 2017 musste ich unter Verwendung der integrierten Datenbank für die Entwicklung, bei der ich Probleme mit der aktuellen Lösung hatte, den Code ändern, damit er funktioniert, da der Fehler auftrat, dass DATE () keine integrierte Funktion war.

Hier ist meine Lösung:

where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)

Dies könnte meiner Meinung nach am einfachsten sein:

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