Varchar转Datetime排序:Oracle时间戳转换ORA-01830报错求助
解决Oracle中带时区的字符串时间排序问题
你的错误根源在于TO_TIMESTAMP的格式模板没有覆盖输入字符串的全部内容——输入里包含了AM/PM标记和时区偏移(+05:30),但你用的模板只定义到微秒,导致Oracle无法解析完整的字符串,所以抛出ORA-01830错误。
正确的解决方案
由于你的时间字符串包含时区信息,应该使用TO_TIMESTAMP_TZ(带时区的时间戳转换函数),同时调整格式模板匹配所有输入部分:
SELECT * FROM ent_organizations ORDER BY TO_TIMESTAMP_TZ(updatedtimestamp, 'DD-MON-RR HH.MI.SS.FF AM TZH:TZM') DESC;
格式模板详细说明
这里的模板各部分对应输入的内容:
DD: 两位日期(比如04)MON: 月份英文缩写(比如JAN)RR: 两位年份(智能解析,18会被识别为2018而非0018,比YYYY更适合两位年份场景)HH: 12小时制的小时(比如11)MI: 分钟(比如23)SS: 秒(比如32)FF: 微秒(比如195734)AM: 上午/下午标记(比如AM)TZH:TZM: 时区小时和分钟偏移(比如+05:30)
额外注意事项
如果你的数据库NLS_DATE_LANGUAGE设置不是英文,可能会导致月份缩写解析失败,这时可以在函数中指定语言参数:
SELECT * FROM ent_organizations ORDER BY TO_TIMESTAMP_TZ(updatedtimestamp, 'DD-MON-RR HH.MI.SS.FF AM TZH:TZM', 'NLS_DATE_LANGUAGE=ENGLISH') DESC;
内容的提问来源于stack exchange,提问作者darshan kamat
相关产品推荐
相关产品推荐

