Como faço para consultar entre duas datas usando o MySQL?

225

A seguinte consulta:

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

não retorna nada.

Eu deveria ter dados mais do que suficientes para que a consulta funcionasse. O que estou fazendo de errado?

NullVoxPopuli
fonte
32
Seja cauteloso com BETWEEN, já que os valores mine maxsão considerados dentro do intervalo, para não processar duas vezes por data que seja o valor mine max(caso de aresta). Por exemplo, a data 2010-09-29 00:00:00será entre 2010-09-28 00:00:00e2010-09-29 00:00:00 , E TAMBÉM entre 2010-09-29 00:00:00e2010-09-30 00:00:00
minipif 27/03/15
sim, o que ele disse ^^
Albert Rannetsperger 4/11/16

Respostas:

472

Sua segunda data é anterior à sua primeira data (ou seja, você está consultando entre 29 de setembro de 2010 e 30 de janeiro de 2010). Tente reverter a ordem das datas:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Daniel Vandersluis
fonte
Eu sabia disso, mas agora tem um problema com o UPDATE. Estou tentando usar BETWEEN for UPDATE, deve funcionar da mesma maneira?
Ingus
3
@IngusGraholskis: uma wherecláusula deve funcionar da mesma forma selectou em updatedeclarações.
T30 30/06
Pessoalmente, acho o termo 'de' e 'para' uma maneira sorrateira de lembrar a ordem em que a consulta deve ser escrita.
KeaganFouche 21/01/19
Como retornar todos os dados se as duas datas forem nulas ou vazias?
Coding world
23

Sua consulta deve ter data como

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

experimentar

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

É date_fielddo tipo datetime? Você também precisa colocar a data do aquecedor em primeiro lugar.

Deveria ser:

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

DATE () é uma função do MySQL que extrai apenas a parte da data de uma expressão de data ou data / hora

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
sabin
fonte
você pode adicionar uma explicação para que as pessoas entendam o que você está fazendo.
Franz Gleichmann
7

Como extensão à resposta de @sabin e uma dica se alguém quiser comparar apenas a parte da data (sem a hora):

Se o campo a comparar for do tipo datetime e somente as datas forem especificadas para comparação, essas datas serão convertidas internamente em valores de datetime . Isso significa que a seguinte consulta

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

será convertido para

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

internamente.

Por sua vez, isso resulta em um resultado que não inclui os objetos de 29/09/2010 com um valor de tempo maior que 00:00:00!

Portanto, se todos os objetos com data 29/09/2010 também devem ser incluídos, o campo para comparar deve ser convertido em uma data:

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

Você pode fazer isso manualmente, comparando com maior que ou igual e menor que ou igual.

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

Em nosso exemplo, precisamos recuperar dados de um determinado dia a dia. Compararemos do início do dia ao último segundo em outro dia.

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

Pode haver um problema com a configuração da data no servidor ou no cliente. Descobri que esse é um problema comum em vários bancos de dados quando o host está configurado em espanhol, francês ou qualquer outra coisa ... que possa afetar o formato dd / mm / aaaa ou mm / dd / aaaa.

SoulWanderer
fonte
3
O problema era que a data mais antiga foi listada antes da data mais recente.
theninjagreg
1

Basta converter date_field como data

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

Ao usar valores de Data e Hora, você deve converter os campos como DateTimee não Date. Experimentar :

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))
Bruno Barral
fonte
0

Tente mudar as datas:

2010-09-29 > 2010-01-30?
Jure1873
fonte