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

Oracle SQL中时间戳转指定日期格式报ORA-01722错误的解决方案咨询

问题分析与解决方案

你的方法逻辑搞反啦,这才导致了ORA-01722错误。先给你拆解问题,再给正确的实现方式:

为什么你的SQL报错?

TO_CHAR()函数的作用是把日期、时间戳或数字类型转换成字符串,而不是直接处理字符串输入。你直接把'19-01-21 09:15:00.000000 PM'这个字符串传给TO_CHAR(),Oracle会尝试把它转换成数字/日期类型来处理,自然就触发了"无效数字"的错误。后面嵌套的TO_DATE()也因为前面的错误输入跟着出问题了。

正确的转换思路

要实现你的需求,应该分两步:

  1. 先用TO_TIMESTAMP()(因为输入带微秒)或TO_DATE()把输入的字符串转换成Oracle能识别的日期/时间戳类型。
  2. 再用TO_CHAR()把这个日期/时间戳格式化成你需要的YYYY/MM/DD HH24:MI:SS字符串。

可行的SQL示例

方案1:保留微秒精度(用TIMESTAMP)

SELECT TO_CHAR(
    TO_TIMESTAMP('19-01-21 09:15:00.000000 PM', 'DD-MM-RR HH:MI:SSxFF AM'),
    'YYYY/MM/DD HH24:MI:SS'
) AS formatted_date
FROM dual;

方案2:忽略微秒(用DATE)

如果不需要微秒部分,可以简化成:

SELECT TO_CHAR(
    TO_DATE('19-01-21 09:15:00 PM', 'DD-MM-RR HH:MI:SS AM'),
    'YYYY/MM/DD HH24:MI:SS'
) AS formatted_date
FROM dual;

关键细节说明

  • DD-MM-RR:用RR处理两位年份比YY更智能——比如这里的19会被识别为2019(00-49对应2000-2049,50-99对应1950-1999),避免年份识别错误。
  • xFF:用来匹配输入字符串中的微秒部分,只有用TO_TIMESTAMP()时需要。
  • HH24:指定输出24小时制的小时,代替原字符串中的12小时制+AM/PM标识。

内容的提问来源于stack exchange,提问作者Rachanaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:57:27