2012-02-10 90 views
-2

我有兩個表...MySQL查詢的日期部分

tblEvent 
-------- 
id 
date 

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

的關係,我可以有一個事件要麼是在第一天(在tblEvent日期)或復發的時間間隔(日,周,Month,Year),它們綁定在tblEventRecurring表中。

例如,如果我把一個事件爲2月10日,直到反覆2月28日我有...

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

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

什麼是最好的方式結構的查詢來獲取所有日期的地方滿足以下條件......

  • tblEvent.date =今日事今日
  • 如果tblEventRecurring.date_part = d和< END_DATE
  • 如果tblEventRecurring.date_部分= W,今天是星期的同一天(週日至週六)爲tblEvent.date和< END_DATE
  • 如果tblEventRecurring.date_part = M,今天是本月的tblEvent.date在同一天< END_DATE 等。

有沒有比另一種更高效的解決方案?這是使用IF或CASE還是一堆AND/OR語句的好時機?

感謝您的任何指導。 D.

因爲我被投票不投入研究,我以爲我會發布我的最終查詢......我一直在努力與一些AND/OR和括號。我進行了研究,並且閱讀了更多關於我從未使用過的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 
+0

嗯,你要求查詢這些條件。所以,我不知道如何改進它。告訴我們你的預期結果應該是什麼。 E.G .:你想知道今天應該發生什麼事件嗎? – 2012-02-10 18:47:48

+0

是的。對不起...對於當前日期,我希望爲該日期設置所有事件,以及與date_part匹配的任何重複事件 – Don 2012-02-10 20:19:28

+0

第二次投票的任何解釋? – Don 2013-01-02 20:37:48

回答

0

這與Mosty的回答基本相同,但是使用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)) 
    ) 
) 

我不知道這是否是任何對你有用的,但想到我會發布它,因爲我已經做了,現在

SELECT * 
FROM `date_list` 
LEFT JOIN (
    SELECT `tblEvent`.`id`, `tblEvent`.`date`, `tblEvent`.`name`, `tblEventRecurring`.`date_part`, `tblEventRecurring`.`end_date` 
    FROM `tblEvent` 
    LEFT JOIN `tblEventRecurring` 
     ON `tblEvent`.`id` = `tblEventRecurring`.`event_id` 
) AS `events` 
    ON (
     `events`.`date` = `date_list`.`date` 
    ) 
    OR (
     `date_list`.`date` BETWEEN `events`.`date` AND `events`.`end_date` 
     AND (
      (`events`.`date_part` = 'D') OR 
      (`events`.`date_part` = 'W' AND DAYOFWEEK(`events`.`date`) = DAYOFWEEK(`date_list`.`date`)) OR 
      (`events`.`date_part` = 'M' AND DAYOFMONTH(`events`.`date`) = DAYOFMONTH(`date_list`.`date`)) 
     ) 
    ) 
WHERE `date_list`.`date` BETWEEN '2012-02-06' AND '2012-02-12' 
ORDER BY `date_list`.`date`; 

它假定一個date_list表由含有單date場一個連續的日期列表。

0

那裏沒有那麼多的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?

+0

是的。可能應該。 curdate()是否比CURRENT_DATE更好用,還是相同,只是不同的語法? – Don 2012-02-10 20:21:36

+0

文檔說CURRENT_DATE和CURRENT_DATE()是CURDATE()的同義詞。我的想法:CURDATE()更短:) – 2012-02-10 20:27:55

+0

很酷。謝謝。我對「總是這樣做」感到內疚,我想:) – Don 2012-02-10 21:14:21