MySQL Query для даты части - PullRequest
       4

MySQL Query для даты части

0 голосов
/ 10 февраля 2012

У меня есть две таблицы ...

tblEvent
--------
id
date

tblEventRecurring
-----------------
event_id
date_part
end_date

Отношение в том, что я могу иметь событие, которое происходит либо в один день (дата в tblEvent), либо повторяется с интервалом (день, неделя, месяц,Year), который связывается в таблице tblEventRecurring.

Например, если я добавлю событие, повторяющееся до 10 февраля, до 28 февраля, у меня будет ...

tblEvent
--------
id = 1
date = 2012-02-10

tblEventRecurring
-----------------
event_id = 1
date_part = D
end_date = 2012-02-28

чтоэто лучший способ структурировать запрос, чтобы получить все даты, когда выполняются следующие условия ...

  • tblEvent.date = today
  • , если tblEventRecurring.date_part = D и today
  • , если tblEventRecurring.date_part = W и сегодня тот же день недели (вс-сБ), что и tblEvent.date и
  • , если tblEventRecurring.date_part = M и сегодня тот же деньмесяца как tblEvent.date и

Существует ли одно решение более эффективное, чем другое?Это хорошее время для использования IF или CASE или набора операторов AND / OR?

Спасибо за любые рекомендации.D.

Поскольку за меня проголосовали за то, что я не исследовал, я решил опубликовать свой последний запрос ... Я боролся с некоторыми из И / ИЛИ и скобками.Я сделал исследование и читал больше на CASE, который я никогда не использовал, поэтому я надеялся, что кто-то может направить мой запрос, используя его.

# where the current date is 2012-02-12
SELECT e.record_id, e.event_date, 
       DATE_FORMAT(e.event_time, '%l:%i %p') AS event_time, 
       e.category, pm.person_id, pm.status, pm.active
FROM tblEvent e 
JOIN tblTABLE pmd ON pmd.record_id = e.reference_id 
JOIN tblTABLE2 pm ON pm.record_id = pmd.t_id 
LEFT OUTER JOIN tblEventRecurring er ON er.event_id = e.record_id 
WHERE e.category = 'CAT' 
AND pm.planet_id = 1 # id of person
AND pm.active = 1 
AND pm.status = 'Read Only' 
AND (
    e.event_date = '2012-02-12' # the event is on current date
    OR ( 
        # recurring with no end date or end date in future
        er.end_date = '0000-00-00' OR er.end_date >= '2012-02-12'
        AND ( 
            e.event_date <= '2012-02-12' # recurring starts today or in past
            AND ( # meets any of the following
                (er.date_part = 'D') 
                OR (er.date_part = 'W' AND dayofweek('2012-02-12') = dayofweek(e.event_date)) 
                OR (er.date_part = 'M' AND dayofmonth('2012-02-12') = dayofmonth(e.event_date)) 
                OR (er.date_part = 'Y' AND (day('2012-02-12') = day(e.event_date) AND MONTH('2012-02-12') = MONTH(e.event_date)))
            ) 
        ) 
    )
)
ORDER BY e.event_time

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

По сути, это то же самое, что и ответ Мости, но с LEFT JOIN для извлечения событий, которые происходят только один раз.Это извлечет все события за сегодня.

SELECT *
FROM `tblEvent`
LEFT JOIN `tblEventRecurring`
    ON `tblEvent`.`id` = `tblEventRecurring`.`event_id`
WHERE (`tblEvent`.`date` = CURRENT_DATE AND `tblEventRecurring`.`event_id` IS NULL)
OR (
    CURRENT_DATE BETWEEN `tblEvent`.`date` AND `tblEventRecurring`.`end_date`
    AND (
        (`tblEventRecurring`.`date_part` = 'D') OR
        (`tblEventRecurring`.`date_part` = 'W' AND DAYOFWEEK(`tblEvent`.`date`) = DAYOFWEEK(CURRENT_DATE)) OR
        (`tblEventRecurring`.`date_part` = 'M' AND DAYOFMONTH(`tblEvent`.`date`) = DAYOFMONTH(CURRENT_DATE))
    )
)

Я не уверен, имеет ли это какое-либо значение для вас, но подумал, что я опубликую это, как я сделал это сейчасПредполагается, что таблица date_list состоит из одного поля date, содержащего непрерывный список дат.

0 голосов
/ 10 февраля 2012

Там не так много AND и OR там. Я думаю, что вы ищете что-то вроде этого:

select * from tblEvent e
join tblEventRecurring er on e.id = er.event_id
where e.date = curdate() and curdate() < er.end_date and (
    (er.date_part = 'D') or
    (er.date_part = 'W' and dayofweek(curdate()) = dayofweek(e.date)) or
    (er.date_part = 'M' and dayofmonth(curdate()) = dayofmonth(e.date))
)

В любом случае ... не должно быть curdate () <= чем er.end_date? </p>

...