故障004:非法的时间日期类型数据
DM技术交流QQ群:940124259
1. 问题描述
某单位某开发人员信息call我,日期转换函数咋报错(非法的时间日期类型数据
)呢。指导他一顿操作猛如虎,终解惑也。
如下报错截图:
2. 解决方法
步骤1:检查报错端的数据库版本
select id_code;
步骤2:对比自己的数据库版本和运行结果
select id_code, to_date('2020-03-04 12:00:05', 'YYYY-MM-DD');
/*
so beautiful! so unbelievable!
老版本如此美好,如此美妙。新版本令人难以置信。
*/
步骤3:查阅时间类兼容参数
select * from v$dm_ini where para_name like '%DATE%TIME%';
/*
very nice!
好家伙,新版本多了一个新参数'DATETIME_FAST_RESTRICT'
仔细阅读参数含义,获知,
DATETIME_FAST_RESTRICT=0 表示字符串可以带时间。
DATETIME_FAST_RESTRICT=1 表示字符串不允许带时间,带时间会报错。
针对两种场景起作用:
1. TO_DATE(字符串, FAST格式)函数转换。
2. alter session set nls_date=<FAST格式>,再使用cast(字符串 as date)函数转换。
所谓的FAST格式: YYYY-MM-DD 或 YYYY/MM/DD 或 YYYY:MM:DD 或 YYYY.MM.DD
话音刚落,这不就是恰逢第一种场景to_date函数,第一个参数中字符串多带时间描述,
第二个参数日期时间解析格式少了时间(满足FAST范式),又因DATETIME_FAST_RESTRICT=1参数意思
不准带时间字符串指定,故报错。剩下解决的办法来咯,见步骤4.
*/
步骤4:对症下药设参
call sp_set_para_value(1, 'DATETIME_FAST_RESTRICT', 0); -- 向开发人员确认,已解决,here it is.
/*
结论:
1. 新旧版本最好先对比下结果,联想参数是否新增。
2. 本人验证1-190 (2021年3月)以后的新版本(更细的版本,当时手里没有,在此论个大概),增加DATETIME_FAST_RESTRICT兼容参数,请大家注意。
3. 新版本增加这个参数,大家不要觉得很low,这也代表数据库越来越严谨。
*/