Come si esegue una query tra due date utilizzando MySQL?


225

La seguente query:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

non restituisce nulla.

Dovrei avere dati più che sufficienti per far funzionare la query. Che cosa sto facendo di sbagliato?


32
Essere cauti con TRA, sia come mine maxvalori sono considerati nell'intervallo, di non processare due volte una data che sono forniti dal mine maxvalore (caso limite). Ad esempio, la data 2010-09-29 00:00:00sarà tra 2010-09-28 00:00:00e2010-09-29 00:00:00 , E ANCHE tra 2010-09-29 00:00:00e2010-09-30 00:00:00
minipif

sì, quello che ha detto ^^
Albert Rannetsperger,

Risposte:


472

La tua seconda data è precedente alla tua prima data (es. Stai effettuando una query tra il 29 settembre 2010 e il 30 gennaio 2010). Prova a invertire l'ordine delle date:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

Lo sapevo ma ora ha problemi con AGGIORNAMENTO. Sto cercando di usare BETWEEN per UPDATE, dovrebbe funzionare allo stesso modo?
Ingus,

3
@IngusGraholskis: una whereclausola dovrebbe funzionare allo stesso modo su selecto updateistruzioni.
T30,

Personalmente, trovo il termine "da" e "a" un modo subdolo per ricordare l'ordine in cui la query dovrebbe essere scritta.
KeaganFouche,

Come restituire tutti i dati se entrambe le date sono nulle o vuote?
Mondo dei codici il

23

La tua query dovrebbe avere la data come

select * from table between `lowerdate` and `upperdate`

provare

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

È date_fielddi tipo datetime? Inoltre è necessario inserire prima la data del eariler.

Dovrebbe essere:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE () è una funzione MySQL che estrae solo la parte data di un'espressione data o data / ora

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

si potrebbe aggiungere una spiegazione così la gente capirà che cosa si sta facendo.
Franz Gleichmann,

7

Come estensione alla risposta di @sabin e un suggerimento se si desidera confrontare solo la parte della data (senza l'ora):

Se il campo da confrontare proviene dal tipo datetime e solo le date vengono specificate per il confronto, tali date vengono convertite internamente in valori datetime . Ciò significa che la seguente query

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

verrà convertito in

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

internamente.

Questo a sua volta porta a un risultato che non include gli oggetti dal 29/09/2010 con un valore temporale superiore a 00:00:00!

Pertanto, se devono essere inclusi anche tutti gli oggetti con data 2010-09-29, il campo da confrontare deve essere convertito in una data:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

Puoi farlo manualmente, confrontando con maggiore o uguale e minore di o uguale.

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

Nel nostro esempio, abbiamo bisogno di recuperare i dati da un determinato giorno per giorno. Confronteremo dall'inizio della giornata all'ultimo secondo in un altro giorno.

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

Potrebbe essere un problema con la configurazione della data sul lato server o sul lato client. Ho trovato che questo è un problema comune su più database quando l'host è configurato in spagnolo, francese o altro ... che potrebbe influenzare il formato gg / mm / aaaa o mm / gg / aaaa.


3
Il problema era che la data precedente era elencata prima della data più recente.
theninjagreg,

1

Basta lanciare date_field come data

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

Quando si utilizzano i valori di data e ora, è necessario eseguire il cast dei campi come DateTimee non Date. Provare :

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

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.