-
-
Save carlospuk/5371210 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Good catch on the @dayoftheweek flaw, thanks!