Come confrontare le date di timestamp con il parametro di sola data in MySQL?


91

In un'istruzione SQL, come posso confrontare una data salvata come TIMESTAMP con una data nel formato AAAA-MM-GG?

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

Voglio che questa query restituisca tutte le righe con timestamp nel giorno specificato, ma restituisce solo le righe con timestamp di mezzanotte.

Grazie

Risposte:


150

È possibile utilizzare la DATE()funzione per estrarre la parte della data del timestamp:

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

Tuttavia, se hai un indice sulla colonna timestamp, questo sarebbe più veloce perché potrebbe utilizzare un indice sulla colonna timestamp se ne hai uno:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

6
Attraverso un piccolo test che ho appena eseguito, ho scoperto che l'utilizzo di BETWEEN è più veloce di un fattore 10 volte FYI
DarbyM

1
Usa una data in cui sia chiaro quale numero significa che tipo.
Lukas Salich


7

Come suggerito da alcuni, usando DATE(timestamp)stai applicando la manipolazione alla colonna e quindi non puoi fare affidamento sull'ordinamento dell'indice.

Tuttavia, l'utilizzo BETWEENsarebbe affidabile solo se includi i millisecondi. Nell'esempio di timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'escludi i record con un timestamp compreso tra 2012-05-05 23:59:59.001e 2012-05-05 23:59:59.999. Tuttavia, anche questo metodo presenta alcuni problemi, a causa della precisione dei tipi di dati. A volte vengono arrotondati per eccesso 999 millisecondi.

La cosa migliore da fare è:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

Usa una funzione di conversione di MYSQL:

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

Questo dovrebbe funzionare


1

Mentre stavo cercando questo, ho pensato che sarebbe stato bello modificare la soluzione BETWEEN per mostrare un esempio per una particolare data non statica / stringa, ma piuttosto una data variabile, o odierna come CURRENT_DATE(). Questo UTILIZZERÀ l'indice nella colonna 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));

Ho fatto i secondi / microsecondi per evitare il caso 12AM il giorno successivo. Tuttavia, potresti anche fare "INTERVALLO" 1 GIORNO "tramite operatori di confronto per un approccio non BETWEEN più intuitivo:

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

Entrambi questi approcci useranno l'indice e dovrebbero funzionare MOLTO più velocemente. Entrambi sembrano essere altrettanto veloci.


0

Nel caso in cui si utilizzino parametri SQL per eseguire la query, ciò sarebbe utile

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

0

Quando ho letto la tua domanda, ho pensato che fossi su Oracle DB finché non ho visto il tag "MySQL". Ad ogni modo, per le persone che lavorano con Oracle ecco il modo:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.