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?


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

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

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

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

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

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

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.