Oracle:如何将CURRENT_TIMESTAMP转为当日0点?提取今日数据ID报错
解决Oracle SQL提取今日修改数据ID的ORA-01843错误问题
问题分析
你碰到的ORA-01843错误源于无效的月份格式解析:原语句里的TO_DATE(CURRENT_DATE, 'DD-MON-RR')既逻辑冗余又依赖会话的NLS(国家语言支持)设置。CURRENT_DATE本身就是DATE类型,Oracle会先把它转成字符串(用当前会话的NLS_DATE_FORMAT规则),再用DD-MON-RR格式去解析。如果应用会话的NLS_DATE_LANGUAGE不是英文(比如中文环境),月份缩写无法匹配,就会触发这个错误。
最优解决方案
直接用TRUNC()函数把日期截断到当日00:00:00,这是Oracle里获取当日起始时间最简洁、可靠的方式,完全避开NLS依赖问题:
SELECT DISTINCT id FROM changes_table WHERE valid_to > TRUNC(CURRENT_DATE)
替代方案(若需基于CURRENT_TIMESTAMP处理)
如果一定要用CURRENT_TIMESTAMP转换为当日00:00:00,可以先截断时间部分再转成DATE类型:
SELECT DISTINCT id FROM changes_table WHERE valid_to > TRUNC(CURRENT_TIMESTAMP)
或者显式指定月份解析的语言,避免NLS冲突:
SELECT DISTINCT id FROM changes_table WHERE valid_to > TO_DATE( TO_CHAR(CURRENT_TIMESTAMP, 'DD-MON-RR', 'NLS_DATE_LANGUAGE=ENGLISH'), 'DD-MON-RR', 'NLS_DATE_LANGUAGE=ENGLISH' )
内容的提问来源于stack exchange,提问作者Guzmicz
相关产品推荐
相关产品推荐

