You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中筛选当日到达次日发车的火车站点问题

问题描述

需要在MySQL中筛选列车当日到达、次日发车的火车站点(例如列车当日23:55到达,次日00:10发车)。数据库中到达与发车时间以分钟数形式存储(如23:55对应23*60+55=1435分钟,次日00:10对应10分钟),涉及字段如下:

  • train_route_id(int11):列车线路ID
  • station_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:19:51