MariaDB如何筛选8:00-16:00的行及CAST时间比较无返回结果问题
问题原因排查
你遇到的无返回结果问题,核心原因大概率是DepTime字段的存储格式和CAST转换逻辑不匹配,最常见的场景是航班准点率数据集的DepTime为HHMM格式的整数类型(比如8点存储为800、16点30存储为1630),直接CAST(DepTime AS TIME)会将数值按「秒」解析,比如800会被转换为00:08:00,自然永远小于08:00:00,导致无结果返回。
第一步:验证转换逻辑是否正确
先执行以下语句查看转换结果是否符合预期:
SELECT DepTime, CAST(DepTime AS TIME) AS 转换后时间, CAST(DepTime AS TIME) > '08:00:00' AS 比较结果 FROM ontime LIMIT 20;
如果输出的转换后时间和实际的起飞时间不符,就说明转换逻辑需要调整。
修正方案
场景1:DepTime为HHMM格式整数
使用LPAD补全前导零后再转换为TIME类型,筛选8:00到16:00的查询语句如下:
SELECT * FROM ontime WHERE Cancelled != 1 AND Diverted != 1 AND CAST(LPAD(DepTime, 4, '0') AS TIME) BETWEEN '08:00:00' AND '16:00:00';
如果追求查询性能,也可以直接用数值比较(无需类型转换,可命中索引):
SELECT * FROM ontime WHERE Cancelled != 1 AND Diverted != 1 AND DepTime BETWEEN 800 AND 1600;
场景2:DepTime为字符串格式
如果DepTime是字符串但存在空格、格式不规范的问题,先修剪后再转换:
SELECT * FROM ontime WHERE Cancelled != 1 AND Diverted != 1 AND CAST(TRIM(DepTime) AS TIME) BETWEEN '08:00:00' AND '16:00:00';
内容的提问来源于stack exchange,提问作者Kevin Garcia
相关产品推荐
相关产品推荐

