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?
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?
Odpowiedzi:
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')
where
klauzula powinna działać tak samo na select
lub update
oświadczenia.
Jest date_field
typu 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')
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';
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')
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';
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.
Korzystając z wartości daty i godziny, musisz rzutować pola jako DateTime
i 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))
min
imax
wartości uznaje się w zakresie i nie przetwarza dwa razy datę, albomin
imax
wartość (przypadek kant). Na przykład, termin2010-09-29 00:00:00
będzie między2010-09-28 00:00:00
i2010-09-29 00:00:00
, I RÓWNIEŻ pomiędzy2010-09-29 00:00:00
i2010-09-30 00:00:00