如何修复SQL中ORA-01722错误并计算到达时间与当前时间差
问题分析与解决方案
错误原因
ORA-01722 错误源于你尝试将带冒号的时间字符串(如'14:30')转换为数字。TO_CHAR(SYSDATE, 'HH24:MI')和转换后的到达时间字符串包含冒号,无法被TO_NUMBER()解析为有效数字,因此触发无效数字错误。
修正思路
不要通过字符串转数字的方式计算时间差,应该直接使用Oracle的日期/时间类型进行运算:
- 将
arrival_TIME(数字类型的HH24MI格式,如1025对应10:25)转换为合法的日期时间值 - 用当前时间
SYSDATE减去转换后的到达时间,得到时间间隔 - 将时间间隔转换为你需要的单位(分钟、小时等)
修正后的查询
示例1:获取分钟数差值
SELECT TO_CHAR(TO_DATE(LPAD(TO_CHAR(arrival_TIME), 4, '0'), 'HH24MI'), 'HH24:MI') AS "Arrival time", -- 计算当前时间与到达时间的分钟差,ROUND用于取整 ROUND((SYSDATE - TO_DATE(LPAD(TO_CHAR(arrival_TIME), 4, '0'), 'HH24MI')) * 24 * 60) AS "Length of Stay (minutes)" FROM EMR_FILES WHERE emr_no = 299; -- 若emr_no是字符类型,改为'00299'
示例2:获取小时数差值(保留2位小数)
SELECT TO_CHAR(TO_DATE(LPAD(TO_CHAR(arrival_TIME), 4, '0'), 'HH24MI'), 'HH24:MI') AS "Arrival time", ROUND((SYSDATE - TO_DATE(LPAD(TO_CHAR(arrival_TIME), 4, '0'), 'HH24MI')) * 24, 2) AS "Length of Stay (hours)" FROM EMR_FILES WHERE emr_no = 299;
关键说明
LPAD(TO_CHAR(arrival_TIME), 4, '0'):将不足4位的数字补前导零(如123转为0123,对应01:23)TO_DATE(..., 'HH24MI'):将4位字符串转为当天的日期时间(例如当前日期的01:23:00)- Oracle中日期相减结果为天数,乘以
24转小时,乘以60转分钟,按需调整单位
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

