Skip to content

Instantly share code, notes, and snippets.

@carlospuk
Forked from dsamojlenko/getNextTripsForStop.sql
Created April 12, 2013 10:49
Show Gist options
  • Save carlospuk/5371210 to your computer and use it in GitHub Desktop.
Save carlospuk/5371210 to your computer and use it in GitHub Desktop.
DELIMITER $$
DROP PROCEDURE IF EXISTS `ocdata`.`getNextTripsForStop`$$
CREATE PROCEDURE `ocdata`.`getNextTripsForStop` (IN stop VARCHAR(10))
BEGIN
SET @DayOfTheWeek = LCASE(DATE_FORMAT(NOW(),'%W'));
SET @DayOfTheWeekYesterday = LCASE(DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),'%W'));
SET @StopID = stop;
SET @SQL = CONCAT('
SELECT stop_name,
route_short_name,
trip_headsign,
IF(arrival_time >= \'24:00:00\', SUBTIME(arrival_time,\'24:00:00\'),arrival_time) AS arrival_time,
CurrentTime,
CurrentDate,
TimeMax
FROM (
SELECT s.stop_name,
r.route_short_name,
t.trip_headsign,
SUBTIME(st.arrival_time,\'24:00:00\') AS arrival_time,
TIME(NOW()) AS CurrentTime,
DATE_FORMAT(NOW(), \'%Y%m%d\') AS CurrentDate,
TIME(DATE_ADD(NOW(), INTERVAL 1 HOUR)) AS TimeMax
FROM stops s
INNER JOIN stop_times st ON s.stop_id = st.stop_id
INNER JOIN trips t ON st.trip_id = t.trip_id
INNER JOIN routes r ON t.route_id = r.route_id
INNER JOIN calendar c ON t.service_id = c.service_id
WHERE c.service_id IN (
SELECT service_id
FROM calendar c
WHERE DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),\'%Y%m%d\') BETWEEN c.start_date AND c.end_date
AND ', @DayOfTheWeekYesterday, ' = 1
AND service_id NOT IN (
SELECT service_id FROM calendar_dates WHERE date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),\'%Y%m%d\') AND exception_type = 2
)
UNION
SELECT c.service_id
FROM calendar c
INNER JOIN calendar_dates cd ON c.service_id = cd.service_id
WHERE cd.exception_type = 1
AND cd.date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),\'%Y%m%d\')
)
AND s.stop_code = ', @StopID,'
AND arrival_time >= \'24:00:00\'
UNION
SELECT s.stop_name,
r.route_short_name,
t.trip_headsign,
st.arrival_time,
TIME(NOW()) AS CurrentTime,
DATE_FORMAT(NOW(), \'%Y%m%d\') AS CurrentDate,
TIME(DATE_ADD(NOW(), INTERVAL 1 HOUR)) AS TimeMax
FROM stops s
INNER JOIN stop_times st ON s.stop_id = st.stop_id
INNER JOIN trips t ON st.trip_id = t.trip_id
INNER JOIN routes r ON t.route_id = r.route_id
INNER JOIN calendar c ON t.service_id = c.service_id
WHERE c.service_id IN (
SELECT service_id
FROM calendar c
WHERE DATE_FORMAT(NOW(),\'%Y%m%d\') BETWEEN c.start_date AND c.end_date
AND ', @DayOfTheWeek, ' = 1
AND service_id NOT IN (
SELECT service_id FROM calendar_dates WHERE date = DATE_FORMAT(NOW(),\'%Y%m%d\') AND exception_type = 2
)
UNION
SELECT c.service_id
FROM calendar c
INNER JOIN calendar_dates cd ON c.service_id = cd.service_id
WHERE cd.exception_type = 1
AND cd.date = DATE_FORMAT(NOW(),\'%Y%m%d\')
)
AND s.stop_code = ', @StopID, '
AND arrival_time > TIME(NOW())
) a
WHERE arrival_time BETWEEN TIME(NOW()) AND TIME(DATE_ADD(NOW(), INTERVAL 1 HOUR))
ORDER BY arrival_time');
PREPARE STMT FROM @SQL;
EXECUTE STMT;
END;
@dsamojlenko
Copy link

Good catch on the @dayoftheweek flaw, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment