为什么Oracle SQL中的ADD_MONTHS函数存在问题

时间:2019-02-02 11:33:30

标签: sql oracle

我正在使用在线APEX Oracle DB进行一些培训,但遇到其中一项功能困扰,这使我抓狂。

我已经进行了一些测试,并且能够长期使用它,但没有缩短语法。使用缩短的语法会返回一个我无法弄清的错误。任何帮助将不胜感激。

我尝试过的事情:

select add_months('2015/10/12', 4) from dual 返回错误:

  

ORA-01846: not a valid day of the week

我要做什么:

select add_months(to_date('2015/10/12', 'yyyy/mm/dd'), 4) from dual

当我使用add_months(to_date())格式

我得到了Friday, 12 February, 2016

的正确结果

如果我使用add_months(arg1, arg2),它将返回错误。

3 个答案:

答案 0 :(得分:2)

add_months期望date,但是您提供的VARCHAR格式不正确,会导致意外错误。

基本上,oracle无法将给定格式隐式转换为日期

enter image description here

答案 1 :(得分:1)

我能够弄清楚这一点。我运行了systimestamp,这就是返回的内容:

Saturday, 02 February, 2019

然后我将其插入到我遇到麻烦的功能中

select add_months(systimestamp, 4) from dual并返回正确的结果:

Sunday, 02 June, 2019取决于我的日期格式。

答案 2 :(得分:0)

使用下面的SQL查找当前的NLS_DATE_FORMAT

SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT';

基本上,当您将日期作为varchar2字符串传递时,此格式用于隐式日期转换。

因此,我们应该始终使用TO_DATE()

来进行显式日期转换,而不是使用默认的日期格式。