Как использовать пункт where в отдельном datetime (год, месяц, день) - PullRequest
0 голосов
/ 05 июня 2011

http://upic.me/i/hq/capture.png

http://upic.me/i/3g/capture.png

У меня есть таблица, которая делит дату и время на одно поле и устанавливает для этого поля индекс. Я хотел бы использовать где пункт в диапазоне дат ex. с 2010/06/21 по 2011/05/15 Я пытаюсь использовать

where concat_ws('-',year,month,day) between '2010/06/21' and '2011/05/15'

это работа, потому что я использую функцию concat для настройки этих полей, как обычные datetime но он не использует индекс и запрашивает медленно. Эта таблица имеет 3 миллиона записей

если использовать индекс, я попытаюсь ответить на этот запрос

where
year = '2011'
and month between 05 and 06
and day between 21 and 15

Это почти работает, но в последней строке день между 21 и 15 Я не могу использовать это условие Я пытаюсь решить эту проблему, но не могу найти ее и изменить таблицу структур. Я ищу ответ

спасибо

Теперь я могу ИЛИ операцию для запроса спасибо за ваш ответ В другом случае, если бы найти с 2009/08/20 по 2011/04/15, это использовать более длинный запрос и создать путаницу. Кто-то понял?

Ответы [ 4 ]

1 голос
/ 05 июня 2011

Если вы не можете изменить структуру таблицы, вы можете использовать что-то вроде следующего:

WHERE year = '2011'
AND ((month = '05' AND day >= 21) OR (month = '06' AND day <= '15'))

(По крайней мере, я думаю, что запрос делает то, что вы хотите в вашем конкретном случае. Но, например,более длительный промежуток времени, вам придется снова подумать о запросе, и я подозреваю, что такие запросы могут стать проблемой для поддержки)


ОБНОВЛЕНИЕ для обновленного требования

Принцип остается прежним, только запрос становится более сложным.Для диапазона от 2009/08/20 до 2011/04/15 это может выглядеть так:

WHERE year = '2009' AND (month = '08' AND day >= '20' OR month BETWEEN '09' AND '12')
   OR year = '2010'
   OR year = '2011' AND (month BETWEEN '01' AND '03' OR month = '04' AND day <= '15')
1 голос
/ 05 июня 2011

Если это тип даты, вы можете напрямую использовать предложение where /ween. Я хотел бы подумать о переходе на это, это гораздо быстрее, чем varchar с пользовательским форматом даты.

WHERE yourdate BETWEEN "2011-05-01" AND "2011-06-15"

Хотя проверка диапазонов может работать в течение одного месяца, вы обнаружите, если вы запрашиваете между несколькими месяцами, чтобы иметь некоторый запас погрешности, потому что, если вы подумаете об этом, вы выбираете больше, чем вы, возможно, захотите. Использование Datestamp устранит проблемы с производительностью и удобством использования, возникающие при сохранении даты в пользовательском varchar.

Вот два запроса, чтобы преобразовать ваше время, если вам интересно:

ALTER TABLE  `yourtable` ADD  `newdate` DATE NOT NULL;
UPDATE `yourtable` SET `newdate` = STR_TO_DATE(`olddate`, '%Y/%m/%d');

Просто замените «yourtable», «newdate» и «olddate» на имя таблицы, имя столбца новой даты и имена столбцов старой метки даты соответственно.

0 голосов
/ 05 июня 2011

Важно, что вы используете ИЛИ, иначе это глупость

0 голосов
/ 05 июня 2011

где год = 2011 и (месяц между 5 и 6) и (день> 20 или день <16) </p>

Вы разделяете дни и месяц, тогда как вы должны хранить их вместе

скобкидолжен быть установлен ...

Майк

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