Виберіть дані між діапазоном дати / часу


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
його дата і час. Здається, я зрозумів, чому я розгубився. Я використовую програмне забезпечення для жаб для 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_Вже

3
@Used_By_Already Коли на це було отримано відповідь у 2013 році, не було другого секунди MySQL - я ще не чув про хокейну гру, що починається з 23:59 до 00:00, з часом початку другої секунди.
Eugen Rieck,

5
Цей коментар я залишив для читачів, які використовують версії MySQL із точністю до секунди. MySQL версії 5.6.4 або пізнішої підтримує дробові секунди. (Незалежно від того, для якого виду спорту чи цілі призначений діапазон дат.)
Used_By_A вже

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підказує мені, що це не дуже великий стіл.
Гордон Лінофф,


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 обробляє дати РРРР: ММ: ДД ЧЧ: мм: СС і має запит як

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

Ви повинні шукати захист дати щодо того, як ви вставляєте ці дані про дату гри у свою базу даних .. наприклад, якщо ви вставили значення дати на довгу дату або коротку.

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"

просто як це.


Я намагаюся зробити те саме, але це не працює належним чином, отримуючи випадкові дані за датою.
Манджит Кумар Най
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.