1 Востаннє редагувалося flatliner (16.05.2017 18:42:03)

Тема: MYSQL: Обмеження діапазону за роком та місяцем

Якось вже тут запитував дещо в спільноти, мені тоді добряче допомогли. Вирішив спробувати ще раз.

Є оце таблиця з полями `year` (4 цифри) та `month` (1 або 2 цифри), треба вибрати записи що знаходяться в межах діапазону $start - $end виду 'YYYY-MM';

Рішення в лоб - розбити $start та $end на $start_year, $start_month, $end_year та $end_month:

SELECT * FROM ... WHERE (`year` >= $start_year OR (`year` == $start_year AND `month` >= $start_month)) AND (`year` <= $end_year OR (`year` == $end_year AND `month` <= $end_month))

... якось виглядає складнувато і ще треба попередньо розбивати вихідні дані.

Як я зробив, але мені здається воно трохи тормозить:

SELECT * FROM ... WHERE CONCAT(`year`, "-", LPAD(`month`, 2, "0")) >= $start AND CONCAT(`year`, "-", LPAD(`month`, 2, "0")) <= $end

Є відчуття, що існують ще й інші, можливо, більш красиві рішення. Дуже дякую за відповіді.

2

Re: MYSQL: Обмеження діапазону за роком та місяцем

з полями `year` (4 цифри) та `month`

Не дюже гарна думка зберігати дату по частях. Але якщо так то мабудь це підійде:

SELECT * FROM ... WHERE STR_TO_DATE(concat(year,'-',month),'%Y-%m')) between 
  STR_TO_DATE('$start','%Y-%m')) and   STR_TO_DATE('$end','%Y-%m'))

Але краще всеж мати поле певного типу, а не створювати трансформацию при обчислені запиту.

Подякували: flatliner1

3

Re: MYSQL: Обмеження діапазону за роком та місяцем

Слушна думка про одне поле. Найефективніше для двох частин, гадаю, буде таке:

$start = 12*$start_year+$start_month;
$end  = 12*$end_year+$end_month;
... "... WHERE  12*`year`+`month` BETWEEN '$start' AND '$end'"

Але краще зберіть в одну дату чи числове значення, тоді можна буде його ефективно проіндексувати в MySQL.

Подякували: flatliner, VTrim2

4

Re: MYSQL: Обмеження діапазону за роком та місяцем

Дякую за відповіді, дійсно цікаві варіанти. Щодо структури таблиці я також згоден, але на жаль, це не в моїй компетенції її змінювати. Вже є те, що є. Ще раз дякую.