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?
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?
Risposte:
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')
where
clausola dovrebbe funzionare allo stesso modo su select
o update
istruzioni.
È date_field
di 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')
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';
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')
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';
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.
Quando si utilizzano i valori di data e ora, è necessario eseguire il cast dei campi come DateTime
e 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))
min
emax
valori sono considerati nell'intervallo, di non processare due volte una data che sono forniti dalmin
emax
valore (caso limite). Ad esempio, la data2010-09-29 00:00:00
sarà tra2010-09-28 00:00:00
e2010-09-29 00:00:00
, E ANCHE tra2010-09-29 00:00:00
e2010-09-30 00:00:00