MySQL中筛选当日到达次日发车的火车站点问题
问题描述
需要在MySQL中筛选列车当日到达、次日发车的火车站点(例如列车当日23:55到达,次日00:10发车)。数据库中到达与发车时间以分钟数形式存储(如23:55对应23*60+55=1435分钟,次日00:10对应10分钟),涉及字段如下:
train_route_id(int11):列车线路IDstation_code(varchar255):站点编码p_arrival_minute(int11):到达时间(当日分钟数)p_departure_minute(int11):发车时间(当日/次日分钟数)
示例表结构及数据:
train_route_id station_code p_arrival_min p_departure_min 491374 ABC 566 568 491374 DEF 586 590 491374 GHI 606 615 491374 JKL 646 650
尝试的SQL语句(未得到预期结果):
SELECT * FROM train_route_points WHERE -- Train arrived today and departed or departing next day ( DATE_ADD(CURDATE(), INTERVAL p_arrival_minute / 60 MINUTE) = CURDATE() AND DATE_ADD(CURDATE(), INTERVAL p_departure_minute / 60 MINUTE) > CURDATE() ) OR ( DATE_ADD(CURDATE(), INTERVAL p_arrival_minute / 60 MINUTE) < CURDATE() AND DATE_ADD(CURDATE(), INTERVAL p_departure_minute / 60 MINUTE) = CURDATE() )
解决方案
问题分析
原SQL的逻辑错误在于:将分钟数与当前日期(CURDATE())拼接后进行日期比较,这种方式无法正确判断列车在站点的跨天情况——CURDATE()是纯日期格式(如2024-05-20),与拼接后的datetime(如2024-05-20 23:55:00)比较时,会自动将CURDATE()转换为2024-05-20 00:00:00,导致只有分钟数为0的时间才会满足等于CURDATE()的条件,完全不符合需求。
正确SQL实现
由于列车在站点的发车时间必然晚于到达时间,而一天总共有1440分钟(24*60),因此当发车分钟数小于到达分钟数时,即可判定该站点是当日到达、次日发车的情况(到达是当天晚些时候,发车是次日凌晨)。
SELECT * FROM train_route_points WHERE p_departure_minute < p_arrival_minute;
逻辑说明
- 若
p_departure_minute > p_arrival_minute:到达和发车在同一天(如到达566分钟=9:26,发车568分钟=9:28) - 若
p_departure_minute < p_arrival_minute:到达是当天,发车是次日(如到达1435分钟=23:55,发车10分钟=00:10)
内容的提问来源于stack exchange,提问作者zordd
相关产品推荐
相关产品推荐

