Oracle SQL中时间戳转指定日期格式报ORA-01722错误的解决方案咨询
问题分析与解决方案
你的方法逻辑搞反啦,这才导致了ORA-01722错误。先给你拆解问题,再给正确的实现方式:
为什么你的SQL报错?
TO_CHAR()函数的作用是把日期、时间戳或数字类型转换成字符串,而不是直接处理字符串输入。你直接把'19-01-21 09:15:00.000000 PM'这个字符串传给TO_CHAR(),Oracle会尝试把它转换成数字/日期类型来处理,自然就触发了"无效数字"的错误。后面嵌套的TO_DATE()也因为前面的错误输入跟着出问题了。
正确的转换思路
要实现你的需求,应该分两步:
- 先用
TO_TIMESTAMP()(因为输入带微秒)或TO_DATE()把输入的字符串转换成Oracle能识别的日期/时间戳类型。 - 再用
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
相关产品推荐
相关产品推荐

