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?


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

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

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

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

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

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

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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.