Jak zapytać między dwiema datami za pomocą MySQL?

225

Następujące zapytanie:

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

nic nie zwraca.

Powinienem mieć więcej niż wystarczającą ilość danych, aby zapytanie mogło działać. Co ja robię źle?

NullVoxPopuli
źródło
32
Należy zachować ostrożność przy OD, ponieważ oba mini maxwartości uznaje się w zakresie i nie przetwarza dwa razy datę, albo mini maxwartość (przypadek kant). Na przykład, termin 2010-09-29 00:00:00będzie między 2010-09-28 00:00:00i2010-09-29 00:00:00 , I RÓWNIEŻ pomiędzy 2010-09-29 00:00:00i2010-09-30 00:00:00
minipif
tak, co powiedział ^^
Albert Rannetsperger

Odpowiedzi:

471

Druga data przypada przed pierwszą datą (tzn. Zapytania odbywają się między 29 września 2010 a 30 stycznia 2010). Spróbuj odwrócić kolejność dat:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Daniel Vandersluis
źródło
Wiedziałem o tym, ale teraz mam problem z UPDATE. Próbuję użyć MIĘDZY dla AKTUALIZACJI, czy powinno to działać w ten sam sposób?
Ingus
3
@IngusGraholskis: a whereklauzula powinna działać tak samo na selectlub updateoświadczenia.
T30
Osobiście uważam, że termin „od” i „do” jest podstępnym sposobem na zapamiętanie kolejności, w jakiej zapytanie powinno być napisane.
KeaganFouche
Jak zwrócić wszystkie dane, jeśli obie daty są zerowe lub puste?
Świat kodowania
23

Twoje zapytanie powinno mieć datę jak

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

próbować

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Nik
źródło
20

Jest date_fieldtypu datetime? Musisz także ustawić datę wkładki usznej na pierwszym miejscu.

Powinno być:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Rakieta Hazmat
źródło
17

DATE () to funkcja MySQL, która wyodrębnia tylko część daty wyrażenia daty lub daty / godziny

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
sabin
źródło
Państwo mogłoby dodać wyjaśnienie tak ludzie zrozumieją, co robisz.
Franz Gleichmann
6

Jako rozszerzenie odpowiedzi @sabin i podpowiedź, jeśli chce się porównać tylko część daty (bez czasu):

Jeśli pole do porównania pochodzi z typu datetime i dla porównania określono tylko daty , daty te są wewnętrznie konwertowane na wartości datetime . Oznacza to, że następujące zapytanie

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

zostanie przekonwertowany na

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

wewnętrznie.

To z kolei prowadzi do wyniku, który nie obejmuje obiektów z 29.09.2010 r. O wartości czasu większej niż 00:00:00!

Dlatego też, jeśli wszystkie obiekty z datą 2010-09-29 powinny zostać uwzględnione, pole do porównania musi zostać przekonwertowane na datę:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
ltlBeBoy
źródło
4

Możesz to zrobić ręcznie, porównując wartości większe lub równe i mniejsze lub równe.

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

W naszym przykładzie musimy pobierać dane z określonego dnia. Porównamy od początku dnia do ostatniej sekundy innego dnia.

  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
źródło
1

Może to być problem z konfiguracją daty po stronie serwera lub po stronie klienta. Odkryłem, że jest to częsty problem w wielu bazach danych, gdy host jest skonfigurowany w języku hiszpańskim, francuskim lub czymkolwiek innym ... co może mieć wpływ na format dd / mm / rrrr lub mm / dd / rrrr.

SoulWanderer
źródło
3
Problem polegał na tym, że starsza data była wymieniona przed nową datą.
theninjagreg
1

Po prostu użyj date_field jako date

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )
DS Mercy
źródło
1

Korzystając z wartości daty i godziny, musisz rzutować pola jako DateTimei nie Date. Próbować :

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
źródło
0

Spróbuj zmienić daty:

2010-09-29 > 2010-01-30?
Jure1873
źródło