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'
Обязательно заверните даты в одинарной кавычке ''
Надеюсь, что это поможет.