How do I use calendar exceptions to generate accur

2019-03-03 20:29发布

问题:

I'm having trouble figuring out the GTFS query to obtain the next 20 schedules for a given stop ID and a given direction.

I know the stop ID, the trip direction ID, the time (now) and the date (today)

I wrote

SELECT DISTINCT ST.departure_time FROM stop_times ST
JOIN trips T ON T._id = ST.trip_id
JOIN calendar C ON C._id = T.service_id
JOIN calendar_dates CD on CD.service_id = T.service_id
WHERE ST.stop_id =  3377699724118483 
AND T.direction_id = 0
AND ST.departure_time >= "16:00:00"
AND 
( 
( C.start_date <= 20140607 AND C.end_date >= 20140607 AND C.saturday= 1 ) // regular service today
AND (     ( CD.date != 20140607 ) // no exception today
OR  ( CD.date = 20140607 AND CD.exception_type = 1 ) // or ADDED exception today
)
)
ORDER BY stopTimes.departure_time LIMIT 20

This results in no record being found. If a remove the last part, dealgin with the CD tables (i.e. the removed or added exceptions), it works perfectly fine.

So I think I'm miswriting the check on the exceptions. As written above with // comments, I want to check that

  • today is in a regular service (from checking the calendar table)
  • there is no removal exception for today (or in this case the trips corresponding to this service id are not included in the computation)
  • if there is added exception for today, the corresponding trips shall be included in the computation

can you help me with that ?

回答1:

I'm fairly certain it's not possible to do what you're trying to do with only a single SELECT statement, due to the design of the calendar and calendar_dates tables.

What I do is use a second, inner query to build the set of active service IDs on the requested date, then join the outer query against this set to include only results relevant for that date. Try this:

SELECT DISTINCT ST.departure_time FROM stop_times ST
  JOIN trips T ON T._id = ST.trip_id
  JOIN (SELECT _id FROM calendar
          WHERE start_date <= 20140607
            AND end_date >= 20140607
            AND saturday = 1
          UNION
            SELECT service_id FROM calendar_dates
              WHERE date = 20140607
                AND exception_type = 1
          EXCEPT
            SELECT service_id FROM calendar_dates
              WHERE date = 20140607
                AND exception_type = 2
       ) ASI ON ASI._id = T.service_id
  WHERE ST.stop_id = 3377699724118483 
    AND T.direction_id = 0
    AND ST.departure_time >= "16:00:00"
  ORDER BY ST.departure_time
  LIMIT 20


标签: sql gtfs