Як здійснити запит між двома датами за допомогою MySQL?


225

Наступний запит:

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

нічого не повертає.

У мене повинно бути більше ніж достатньо даних, щоб запит працював. Що я роблю неправильно?


32
Будь обережний з між ними, так як обидва 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
minipif

так, що він сказав ^^
Альберт Раннецпергер

Відповіді:


471

Ваша друга дата - до першого побачення (тобто ви запитуєте між 29 вересня 2010 року та 30 січня 2010 року). Спробуйте змінити порядок дат:

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

Я це знав, але тепер має проблему з UPDATE. Я намагаюся використовувати МЕЖДУ для оновлення, чи має це працювати так само?
Інгус

3
@IngusGraholskis: whereпункт повинен працювати так само selectабо на updateзаяви.
T30

Особисто я знаходжу термін "від" і "до" підлий спосіб запам'ятати порядок, у якому запит повинен бути записаний.
KeaganFouche

Як повернути всі дані, якщо обидві дати недійсні чи порожні?
Світ кодування

23

Ваш запит має мати дату

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

спробуйте

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

20

Є date_fieldтипу datetime? Також потрібно на перше місце поставити дату вух.

Вона повинна бути:

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

17

DATE () - функція MySQL, яка витягує лише частину дати в виразі дати або часу

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

Ви можете додати пояснення, щоб люди зрозуміли, що ви робите.
Франц Глейхман

6

Як продовження відповіді від @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')

4

Ви можете це зробити вручну, порівнюючи з більшим або рівним і меншим або рівним.

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

1

Можливо, це буде проблемою з налаштуванням дати на стороні сервера або на стороні клієнта. Я виявив, що це є загальною проблемою для декількох баз даних, коли хост налаштований на іспанській, французькій або будь-якій іншій формі, що може вплинути на формат dd / mm / yyyy або mm / dd / yyyy.


3
Проблема полягала в тому, що старіші дати перераховувались до нової дати.
theninjagreg

1

Просто закиньте date_field як дату

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

Використовуючи значення "Дата" та " Час", ви повинні додавати поля як 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))

0

Спробуйте переключити дати навколо:

2010-09-29 > 2010-01-30?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.