ORACLE SQL日期函数报错

时间:2024-04-06 19:40:04

ORACLE SQL日期函数报错

在使用oracle的日期函数时经常会遇到日期中的时间节点无效,格式字符串不匹配的问题,
例如

select next_day(to_date('1997-7-7','yyyy-mm-dd'),'monday') from dual

报错ora-01846:周中的日无效

按照next_day(date,‘day’)的格式写是没有错的,可还是显示日(day)无效,这时先检查一遍
日期转换是否正确

select to_date('1997年7月7日','yyyy/mm/dd') from dual

ORACLE SQL日期函数报错
显示日期已正确转换,而星期一也为Monday无误,为什么还是无法转换呢
既然问题出在星期(day)上,那就先输出一次当前日期的星期(day)

select to_char(to_date('1997-7-7','yyyy-mm-dd'),'day') from dual

ORACLE SQL日期函数报错

发现输出结果居然是中文星期一而非Monday,将结果套入日期转换中

select next_day(to_date('1997-7-7','yyyy-mm-dd'),'星期一') from dual

ORACLE SQL日期函数报错

得到了我们想要的正确值
先去查询一次错误帮助ora-01846
ORACLE SQL日期函数报错

提供解决办法为输入一个正确格式的正确星期

正确格式问题将我们导向了plsql的汉化,检索了一遍plsql的首选项发现调整语言首选项并没有什么作用,在摸索翻阅了一阵后修改语言环境再试了一遍

ALTER SESSION SET NLS_LANGUAGE=american;
select next_day(to_date('1997-7-7','yyyy-mm-dd'),'monday')from dual

ORACLE SQL日期函数报错

果然是语言环境的问题
虽然这种情况很少会遇到,不过也算是提供了一种解决办法


还有想在输出日期后跟星期时,都是用拼接很是麻烦,后来发现在to_char的格式字符里可以任意放日期字符,而想插入的额外字符用双引括住就可以了,其中年元素(yyyy-2000,year-two thousand),月元素(mm-12,month-december,mond-dec),日元素(dy-sun,day-Sunday,dd-31)

Select select to_char(to_date('1997-7-7','yyyy-mm-dd'),'“The date is”year-month-dd day') from dual

这时报错日期格式无法识别,先别慌,先来看下错误帮助ora-01821
ORACLE SQL日期函数报错

提供解决办法为检查有效日期格式符号,将日期格式提出来试一次

select to_char(sysdate,'year-month-dd day') from dual

ORACLE SQL日期函数报错

并没有什么问题,那就是前面的字符串出了岔子,字符串问题首先应该想到的就是符号问题即双引号半全角混淆,那我们稍作调整

Select to_char(to_date('1997-7-7','yyyy-mm-dd'),'”The date is
”year-month-dd day') from dual

ORACLE SQL日期函数报错

这个错误容易将人导向日期格式,苦苦测试无果实际上就是一个小失误就会浪费时间


有时还会碰到不清楚字段格式而重复转换的问题

select to_date(hire_date,'yyyy/mm/dd') from employees

这时有意思的是汉化前报错为ora-01858目标期待值为数字,汉化后为ora-01861文字与格式字符串不匹配,而后者经常是正常转换时转换格式中字符串不与目标相匹配,如

select to_date('1997年7月7日','yyyy"年"mm"月"dd"曰"') from dual

而错误帮助提供的信息
ORACLE SQL日期函数报错
ORACLE SQL日期函数报错

提供解决办法为前者为修改以匹配数字与类型,后者为修改格式字符串以匹配文字
附带查阅的资料:b
ORACLE SQL日期函数报错