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

如何修复SQL中ORA-01722错误并计算到达时间与当前时间差

问题分析与解决方案

错误原因

ORA-01722 错误源于你尝试将带冒号的时间字符串(如'14:30')转换为数字。TO_CHAR(SYSDATE, 'HH24:MI')和转换后的到达时间字符串包含冒号,无法被TO_NUMBER()解析为有效数字,因此触发无效数字错误。

修正思路

不要通过字符串转数字的方式计算时间差,应该直接使用Oracle的日期/时间类型进行运算:

  1. 将arrival_TIME(数字类型的HH24MI格式,如1025对应10:25)转换为合法的日期时间值
  2. 用当前时间SYSDATE减去转换后的到达时间,得到时间间隔
  3. 将时间间隔转换为你需要的单位(分钟、小时等)

修正后的查询

示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:05:10