Recurring Events, SQL Query

前端 未结 2 512
余生分开走
余生分开走 2021-02-09 12:06

I am aware that questions about recurring events are common but I have not been able to find one with an answer to this specific question about recurring events other than those

相关标签:
2条回答
  • 2021-02-09 12:35
    SELECT DISTINCT(e.eventid),n.nameid,n.firstname,n.lastname,d.dt,r.recurring
    FROM dates d 
    LEFT JOIN recurringtypes r
    /* if event recurring every week E.g. 'Every Monday' */
    ON (r.rectypeid BETWEEN 2 AND 8 AND r.day = d.dow) 
    /* if event recurring every month E.g. 'First Monday, every month' */
    OR ((r.rectypeid BETWEEN 9 AND 36) AND r.day = d.dow AND r.occurrence = d.occurrence) 
    /* if event recurring every last week of month E.g. 'Last Monday, every month' */
    OR (r.rectypeid >= 37 AND r.day = d.dow and r.islast = d.islast)
    LEFT JOIN events e on e.rectypeid = r.rectypeid OR (e.rectypeid <= 1 AND e.eventid IS NOT NULL) 
    LEFT JOIN eventtypes t ON e.eventtypeid = t.eventtypeid
    LEFT JOIN names n ON e.namesid = n.namesid
    WHERE (d.dt BETWEEN '2012/02/01' AND '2012/05/01')
    ORDER BY d.dt;
    
    0 讨论(0)
  • 2021-02-09 12:38

    Unless I'm missing something the answer is suprisingly simple. I had not realised that UNIONs can be sorted on common columns by using an alias, even if those columns are from different tables. So the full query would be:

    SELECT DISTINCT(e.eventid),n.nameid,n.firstname,n.lastname,d.dt AS dait,r.recurring
    FROM dates d 
    LEFT JOIN recurringtypes r
    /* if event recurring every week E.g. 'Every Monday' */
    ON (r.rectypeid BETWEEN 2 AND 8 AND r.day = d.dow) 
    /* if event recurring every month E.g. 'First Monday, every month' */
    OR ((r.rectypeid BETWEEN 9 AND 36) AND r.day = d.dow AND r.occurrence = d.occurrence) 
    /* if event recurring every last week of month E.g. 'Last Monday, every month' */
    OR (r.rectypeid >= 37 AND r.day = d.dow and r.islast = d.islast)
    LEFT JOIN events e on e.rectypeid = r.rectypeid
    LEFT JOIN eventtypes t ON e.eventtypeid = t.eventtypeid
    LEFT JOIN names n ON e.namesid = n.namesid
    WHERE (d.dt BETWEEN '2012/02/01' AND '2012/05/01')
    UNION
    SELECT e.eventid,n.nameid,n.lastname,n.firstname,e.firstdate AS dait,'No' as Recurring
    FROM events e
    LEFT JOIN names n ON n.names = e.namesid 
    AND e.rectypeid <= 1 
    WHERE e.firstdate BETWEEN '2012/02/01' AND '2012/05/01' 
    ORDER BY dait;
    

    It's been pointed out that using a table for looking up dates is a risk because the dates will eventually run out, which is true, but calculating whether a date is, for example, the first Monday in a month (or the second, or fourth or maybe fourth and last), seems like a more complex bit of SQL code than I want to get into at the moment.

    0 讨论(0)
提交回复
热议问题