Oracle SQL中如何将DD-MON-YYYY转YYYY-MM-DD并解决ORA-01861报错
报错原因
- 你使用的格式掩码和实际日期格式不匹配:当前NLS_DATE_FORMAT配置为
DD-MON-RRRR,其中MON对应英文月份缩写(如JAN/FEB),而你在TO_DATE中传入的dd-mm-rrrr/dd-mm-yyyy里的mm是数字月份,二者格式完全不匹配,因此触发ORA-01861 Literal does not match format string报错。 - 如果你操作的是表中DATE类型的列,多调用一次
TO_DATE会触发Oracle隐式类型转换:Oracle会先将DATE类型值按照NLS_DATE_FORMAT隐式转为字符串,再用你传入的格式掩码做转换,进一步放大了格式不匹配的问题。
正确实现方案
场景1:操作的是Oracle DATE类型的列(你问题描述的场景)
DATE类型本身没有固定存储格式,你只需要直接调用TO_CHAR指定输出格式即可,不需要额外转DATE:
disp_date := to_char(disp_date, 'yyyy-mm-dd');
场景2:disp_date是存储了DD-MON-YYYY格式值的字符串类型
需要指定和输入格式完全匹配的掩码,同时显式指定日期语言避免环境差异报错:
disp_date := to_char(to_date(disp_date, 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE=AMERICAN'), 'yyyy-mm-dd');
可选全局会话配置
如果你希望当前会话所有DATE类型查询默认都返回YYYY-MM-DD格式,无需每次调用转换函数,可以执行会话级参数修改:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
内容的提问来源于stack exchange,提问作者Manivannan
相关产品推荐
相关产品推荐

