MySQL - выбрать данные из базы данных между двумя датами - PullRequest
12 голосов
/ 10 декабря 2011

Я сохранил даты регистрации пользователя как дату и время, например, 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, но это выглядит не очень хорошо.

Ответы [ 8 ]

32 голосов
/ 10 декабря 2011

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

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)

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

Вы также можете найти оператор МЕЖДУ более читабельным:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
4 голосов
/ 10 декабря 2011
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
4 голосов
/ 10 декабря 2011

Вам необходимо использовать «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
2 голосов
/ 24 февраля 2017

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

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

1 голос
/ 10 декабря 2011

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

1 голос
/ 10 декабря 2011

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

0 голосов
/ 09 сентября 2017

Вы можете использовать функцию 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'

Убедитесь, чтооберните даты в одинарные кавычки ''

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

0 голосов
/ 10 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...