2012-02-10 16 views
-2

のために、私は2つのテーブルを持っている...MySQLのクエリ日付パート

tblEvent 
-------- 
id 
date 

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

関係は、私は1日(tblEventの日付)のいずれかであるか、間隔(日、週に再発するイベントを持つことができています、Month、Year)を使用して、tblEventRecurringテーブルを関連付けます。

たとえば、私は2月28日まで、繰り返し2月10日のイベントに置けば、私が持っていると思います...

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

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

すべての日付を取得するには、クエリの最良の方法構造ものですtblEventRecurring.date_part = Dと今日< END_DATE

  • tblEventRecurring.date_かの場合には条件が満たされた...

    • tblEvent.date =今日
    • 以下tblEventRecurring.date_part = Mと今日はなどtblEvent.dateと< END_DATE として月の同じ日の場合= Wと今日の一部は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 .:今日どのような出来事が起こるべきか知りたいですか? –

    +0

    はい。申し訳ありません...現在の日付については、日付と日付の部分が一致するすべてのイベントを設定したいと考えています – Don

    +0

    2番目の投票の理由は何ですか? – Don

    答えて

    0

    これは、Mostyの回答と本質的に同じですが、LEFT JOINを使用すると、1回だけ発生するイベントを取得します。これは、今日のすべてのイベントを取得します。

    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フィールドから成るdate_listテーブルを前提としていて、私はそれを投稿だろうと思いました日付の連続リスト。

    0

    そこにはあまりANDおよびORはありません。 er.end_dateより=()<もとにかく

    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べきではない:私はあなたがこのような何かを探していると思いますか?

    +0

    うん。おそらくそうだろう。 curdate()はCURRENT_DATEより使用するほうが良いですか、それとも同じですか、異なる構文ですか? – Don

    +0

    ドキュメントでは、CURRENT_DATEとCURRENT_DATE()はCURDATE()の同義語です。私の考え:CURDATE()は短くなりました:) –

    +0

    クール。ありがとう。私は "いつもそれをやった"と思っています:) – Don