Выберите данные в диапазоне дат / времени


83

Как выбрать данные между диапазоном дат в MySQL. Моя datetimeколонка представлена ​​в 24-часовом формате времени зулу.

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

Ничего не возвращает, несмотря на наличие данных между этими периодами времени. Должен ли я принудительно вводить значения в полях «от» и «до» для datetimeввода запроса?


Для чего нужен этот тип данных game_date?
hjpotter92

1
его дата и время. Думаю, я понял, почему запутался. Я использую программное обеспечение toad для mysql, и по умолчанию оно отображает даты в формате, который я использовал в своем диапазоне дат, поэтому я использовал то же самое. Итак, проблема заключалась в формате даты, который я указал в своем диапазоне.
codingknob

Если я использую формат, предоставленный Ойгеном Риком, он работает должным образом.
codingknob

Ответы:


144

Вам необходимо обновить формат даты:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

2
какой здесь день, а какой месяц?
Арун,

8
Формат литерала даты - «ГГГГ-ММ-ДД ЧЧ: мм: СС»
Ойген Рик,

13
Использование BETWEEN НЕ является наилучшей практикой, тем более что MySQL теперь поддерживает точность времени менее секунды . Использование 23:59:59 - это целая секунда до конца дня. where game_date >= '2012-03-11' and game_date < '2012-05-12'- это наиболее точный способ определения диапазона дат, который будет работать с любым уровнем точности времени от даты до долей секунды.
Used_By_Already

3
@Used_By_Already Когда в 2013 году был дан ответ на этот вопрос, MySQL не было меньше секунды - я еще не слышал о хоккейном матче, который начинался между 23:59 и 00:00 с временем начала меньше секунды.
Ойген Рик

5
Я оставил этот комментарий для читателей, использующих версии MySQL с точностью до секунды. MySQL версии 5.6.4 или более поздней поддерживает дробные секунды. (Независимо от того, для какого вида спорта или цели
выбран

19

Вот простой способ использования функции даты:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
Я слепой или это убийство производительности? date(game_date)будет выполняться сравнение с вычисленным значением , а не с полем - в результате не будет использоваться индекс и будет затронута каждая отдельная строка (то есть полное сканирование таблицы)!
Eugen Rieck

1
@EugenRieck. . . В общем, вы правы, если есть индекс на game_date. Даже без индекса таблица должна быть среднего размера для заметной разницы в производительности. Что-то в названии hockey_statsподсказывает мне, что это не очень большой стол.
Гордон Линофф

8

Простой способ:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

Вероятно, вам нужно использовать функцию STR_TO_DATE :

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(если game_date - это строка, вам может потребоваться использовать для нее STR_TO_DATE)


4

Формат даты MySQL следующий: YMD. Вы используете Y / M / D. Это неправильно. измените свой запрос.

Если вы вставите дату, например, Y / M / D, в базу данных будет вставлено нулевое значение.

Если вы используете PHP, и дата, которую вы получаете из формы, выглядит как Y / M / D, вы можете заменить это с помощью оператора.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

Проще говоря, его можно запросить как

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

Это работает, если время не заботит.

Считая время, также поступают следующим образом:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

Обратите внимание, что это для сервера MySQL.


2

Вы можете либо использовать функцию STR_TO_DATE, либо передать свои собственные параметры даты в зависимости от формата, который вы опубликовали:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

Или просто используйте формат, в котором MySQL обрабатывает даты YYYY: MM: DD HH: mm: SS, и запросите как

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;


2

Вы должны искать дату, защищая от того, как вы вставляете эти данные game_date в свою базу данных .. например, если вы вставили значение даты на длинную или короткую дату.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

Вы также можете использовать МЕЖДУ :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

просто как тот.


Я пытаюсь сделать то же самое, но он не работает должным образом, получаю случайные данные по дате.
Manjeet Kumar Nai
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.