ora-01861错误源于日期字符串与格式模型不匹配,必须显式用to_date('2023-10-05','yyyy-mm-dd')指定格式,严禁参数颠倒、忽略时分秒、混用大小写、容忍空格或依赖nls设置。

ORA-01861 错误必须显式用 TO_DATE() 或 TO_TIMESTAMP() 指定格式,不能依赖隐式转换或会话级 NLS_DATE_FORMAT 做兜底。
TO_DATE() 参数顺序写反导致报错
常见错误是把日期字符串和格式串位置颠倒,比如写成 TO_DATE('YYYY-MM-DD', '2023-10-05')。Oracle 会把第一个参数当待解析字符串、第二个当格式模型,这里显然把格式当成了值。
- 正确写法永远是
TO_DATE('2023-10-05', 'YYYY-MM-DD') - 时间部分必须全覆盖:若字符串含时分秒,格式串就得包含
HH24:MI:SS,只写YYYY-MM-DD必报 ORA-01861 - 注意大小写敏感:
mi是分钟,MM是月份;写成mm不报错但语义错(月份被当成分钟)
字符串里有空格或不可见字符
从 Excel 导入、前端传参或拼接 SQL 时,日期字符串前后常带空格、BOM 头或全角符号。Oracle 格式校验是逐字符比对的,一个多余空格就直接失败。
- 先用
LENGTH(TRIM(' 2023-10-05 '))和LENGTH('2023-10-05')对比长度,确认是否有多余字符 - 用
DUMP('2023-10-05', 1016)查十六进制编码,看是否有 0x00、0xFEFF 等隐藏字节 - 安全写法:统一套
TRIM(),例如TO_DATE(TRIM(:input_date), 'YYYY-MM-DD HH24:MI:SS')
不同环境 NLS 设置不一致引发线上失败
本地开发用 PL/SQL Developer,NLS_DATE_LANGUAGE=AMERICAN;生产库是中文环境,MON 解析成“一月”而非“JAN”,TO_DATE('01-JAN-2023', 'DD-MON-YYYY') 就崩了。
- 绝对不要依赖
ALTER SESSION SET NLS_DATE_LANGUAGE临时改——它只影响当前会话,且容易漏设 - 用
TO_DATE('01-01-2023', 'DD-MM-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')显式指定语言参数 - 更稳妥的是避开
MON,全用数字格式:用'YYYY-MM-DD'而不是'DD-MON-YYYY'
对 sysdate 或其他日期变量误用 TO_DATE()
sysdate 本身是 DATE 类型,再套 TO_DATE(sysdate, 'YYYY-MM-DD') 就会触发 ORA-01861,因为函数要求第一个参数是字符串。
- 想截断时间:用
TRUNC(sysdate),不是TO_DATE() - 想转成字符串显示:用
TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS') - 想把字符串转日期再参与运算:才用
TO_DATE('2023-10-05', 'YYYY-MM-DD')
最易被忽略的点:格式串里的分隔符(如 /、-、空格)必须和字符串里完全一致,连数量都不能差——'2023/10/05' 配 'YYYY-MM-DD' 必错,哪怕年月日数字都对。











