MySQL - выбор данных из базы данных между двумя датами

Я сохранил даты регистрации пользователя как дату, так что, например, 2011-12-06 10:45:36. Я запустил этот запрос, и я ожидал, что этот элемент - 2011-12-06 10:45:36 - будет выбран:

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND
created_at <= '2011-12-06'

Но нет. Существует какой-либо элегантный способ, как выбрать этот элемент? Как первая идея, которую я получил, была похожа на 2011-12-06 + 1, но это выглядит не очень хорошо.

Ответ 1

Ваша проблема в том, что короткая версия дат использует полночь в качестве значения по умолчанию. Итак, ваш запрос:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
AND created_at <= '2011-12-06 00:00:00'

Вот почему вы не видите запись за 10:45.

Измените его на:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01' 
AND created_at <= '2011-12-07'

Вы также можете использовать:

SELECT users.* from users 
WHERE created_at >= '2011-12-01' 
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)

который выберет всех пользователей за тот же промежуток времени, который вы ищете.

Вы также можете найти оператор BETWEEN более читаемым:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));

Ответ 2

SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';

Ответ 3

Вам нужно использовать '2011-12-07' в качестве конечной точки в качестве даты без времени по умолчанию до 00:00:00.

То, что вы на самом деле написали, интерпретируется как:

 SELECT users.* 
 FROM   users
 WHERE  created_at >= '2011-12-01 00:00:00' 
   AND  created_at <= '2011-12-06 00:00:00'

И ваш штамп времени: 2011-12-06 10:45:36, который не находится между этими точками.
Измените это тоже:

 SELECT users.* 
 FROM   users
 WHERE  created_at >= '2011-12-01'  -- Implied 00:00:00
   AND  created_at <  '2011-12-07'  -- Implied 00:00:00 and smaller than 
                                   --                  thus any time on 06

Ответ 4

Вы пробовали до и после, а не >= и < =? Кроме того, это дата или временная метка?

Ответ 5

Поиск created_at <= '2011-12-06' будет искать любые записи, которые были созданы до или до полуночи 2011-12-06 , Вы хотите найти created_at < '2011-12-07'.

Ответ 6

Другой альтернативой является использование функции DATE() в левом операнде, как показано ниже

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'

 

Ответ 7

Может быть, между ними лучше. Он работал у меня, чтобы получить диапазон, затем отфильтровать его

Ответ 8

Вы можете использовать функцию MySQL DATE, как показано ниже

Например, если вы хотите получить результаты между 2017-09-05 по 2017-09-09

SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09'

Обязательно заверните даты в одинарной кавычке ''

Надеюсь, что это поможет.