выборка из mysql

S5
На сайте с 04.01.2010
Offline
77
822

Всем добра! Столкнулся с интересной задачей, которую не могу победить к концу рабочего дня. Есть условие - сезонный товар на сайте, который должен отображаться с xx по yy каждый год. В базе для таких товаров храню 2 поля - season_start и season_end, в которых лежит инфа стрингом формата dd-mm. В чем собственно затык - если дата окончания товара раньше даты начала (старт продаж декабрь - конец - январь), получаем разрыв в год. У кого есть какие идеи о правильной организации такого функционала? Думал сделать выборку вида


WHERE (($season_end < $season_start) AND ($season_start < $cur_date_in_format) AND ($cur_date_in_format < $season_end (??) ))

Под ?? либо манипуляции по увеличению месяца на +12, либо по уменьшению $cur_date_in_format на -12 месяцев. Есть ещё идеи реализации?

DV
На сайте с 01.05.2010
Offline
644
#1

В каком формате дата хранится? Переводите условие выборки в unix timestamp, а потом его уже транслируйте в имеющийся.

Как-то так (добавил, ибо сам нефига не понял из входных данных).

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
S5
На сайте с 04.01.2010
Offline
77
#2

окей, но в следующем году они станут недействительными.

DV
На сайте с 01.05.2010
Offline
644
#3

Сезоны на каждый год нарезайте, всего 4 в году, не обременительно же.

wwwwww
На сайте с 29.04.2011
Offline
195
#4

Я не понял, а где условие на текущий год?

Выбрать, где

дата_начала_скидки (ГОД) = текущему_году И дата_окончания_скидки (ГОД) = текущему_году И время_в_формате_юникс(дата_начала_скидки) < время_в_формате_юникс(дата_конца_скидки)
Видишь? Свободная подпись.
IL
На сайте с 20.04.2007
Offline
435
#5

Если end<start проверять только одно из условий

($season_start < $cur_date_in_format) OR ($cur_date_in_format < $season_end)

p.s. есть надежда, что такой запрос выполняется не каждый раз при открытии страницы, а хотя бы раз в сутки (по крону? при смене даты? просто по таймауту кэша), а в зависимости от результата устанавливается признак отображения товара на сайте.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
S5
На сайте с 04.01.2010
Offline
77
#6
DenisVS:
Сезоны на каждый год нарезайте, всего 4 в году, не обременительно же.

Вы не поняли задачи, сезонным он назван условно. Это может быть букет цветов с 6 по 8 марта, а могут быть санки с 1 декабря по 22 февраля

Я не понял, а где условие на текущий год?

Товар не привязан к конкретному году

($season_start < $cur_date_in_format) OR ($cur_date_in_format < $season_end)

Спасибо за мыслю, нужно обмозговать

p.s. есть надежда, что такой запрос выполняется не каждый раз при открытии страницы, а хотя бы раз в сутки (по крону? при смене даты? просто по таймауту кэша), а в зависимости от результата устанавливается признак отображения товара на сайте.

На крайний случай думал уже именно так и сделать, но хочется все по фен-шую :) Запрос будет выполняться при открытии категории товаров

ukrdev
На сайте с 15.11.2011
Offline
31
#7

sg552, вам нужно привести даты к адекватному значению что бы можно было сравнивать.

Как вариант сделать превращения в SELECT, а потом сравнить их в HAVING после WHERE, т.к. в WHERE псевдонимы не доступны


SELECT
STR_TO_DATE(CONCAT(`session_start`,'-',YEAR(NOW())), '%d-%m-%Y') as `good_session_start`,
STR_TO_DATE(CONCAT(`session_end`,'-',IF(CONVERT(RIGHT(`session_end`, 2), UNSIGNED INTEGER) < CONVERT(RIGHT(`session_start`, 2), UNSIGNED INTEGER), YEAR(NOW())+1, YEAR(NOW()))), '%d-%m-%Y') as `good_session_end`

FROM `tbl_test`

HAVING CURDATE() > `good_session_start` AND CURDATE() < `good_session_end`

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий