Наступний запит:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
нічого не повертає.
У мене повинно бути більше ніж достатньо даних, щоб запит працював. Що я роблю неправильно?
Наступний запит:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
нічого не повертає.
У мене повинно бути більше ніж достатньо даних, щоб запит працював. Що я роблю неправильно?
Відповіді:
Ваша друга дата - до першого побачення (тобто ви запитуєте між 29 вересня 2010 року та 30 січня 2010 року). Спробуйте змінити порядок дат:
SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
where
пункт повинен працювати так само select
або на update
заяви.
Є date_field
типу datetime
? Також потрібно на перше місце поставити дату вух.
Вона повинна бути:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
DATE () - функція MySQL, яка витягує лише частину дати в виразі дати або часу
SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
Як продовження відповіді від @sabin та підказки, якщо ви хочете порівняти лише частину дати (без часу):
Якщо поле для порівняння походить від типу datetime і вказуються лише дати для порівняння, то ці дати внутрішньо перетворюються на значення datetime . Це означає, що наступний запит
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
буде перетворено на
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
внутрішньо.
Це в свою чергу призводить до результату, який не включає об’єкти з 2010-09-29 зі значенням часу, що перевищує 00:00:00!
Таким чином, якщо всі об’єкти з датою 2010-09-29 також повинні бути включені, поле для порівняння має бути перетворене на дату:
SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
Ви можете це зробити вручну, порівнюючи з більшим або рівним і меншим або рівним.
select * from table_name where created_at_column >= lower_date and created_at_column <= upper_date;
У нашому прикладі нам потрібно отримати дані з конкретного дня на день. Ми порівняємо з початку дня до останньої секунди в інший день.
select * from table_name where created_at_column >= '2018-09-01 00:00:00' and created_at_column <= '2018-09-05 23:59:59';
Можливо, це буде проблемою з налаштуванням дати на стороні сервера або на стороні клієнта. Я виявив, що це є загальною проблемою для декількох баз даних, коли хост налаштований на іспанській, французькій або будь-якій іншій формі, що може вплинути на формат dd / mm / yyyy або mm / dd / yyyy.
Використовуючи значення "Дата" та " Час", ви повинні додавати поля як DateTime
і ні Date
. Спробуйте:
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
іmax
значення вважаються в діапазоні, щоб не обробляти двічі дата , яка є абоmin
іmax
значення (крайній випадок). Наприклад, дата2010-09-29 00:00:00
буде між2010-09-28 00:00:00
і2010-09-29 00:00:00
, А також між2010-09-29 00:00:00
і2010-09-30 00:00:00