如何使用日历异常来使用GTFS生成准确的计划?

时间:2014-06-07 16:55:42

标签: sql gtfs

我无法确定GTFS查询以获取给定停止ID和给定方向的下20个计划。

我知道停止ID,行程方向ID,时间(现在)和日期(今天)

我写了

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

这导致没有找到记录。 如果删除最后一部分,处理CD表(即删除或添加的例外),它的工作完全正常。

所以我认为我错误地检查了例外情况。 如上面用//注释所述,我想检查一下

  • 今天是常规服务(从查看日历表)
  • 今天没有删除例外(或者在这种情况下,与此服务ID相对应的旅行不包括在计算中)
  • 如果今天有例外,相应的行程应包含在计算中
你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

由于SELECT的设计,我确定无法执行您只尝试使用calendar个语句的内容,因此我无法做到这一点。和calendar_dates表。

我所做的是使用第二个内部查询在请求的日期构建活动服务ID集,然后将外部查询加入此集合以仅包括与该日期相关的结果。试试这个:

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