文字与格式字符串版本11不匹配

时间:2019-08-02 05:59:17

标签: sql oracle

在我的SQL查询中,

TO_DATE('2019-07-22' , 'YYYY-MM-DD')

我想传递sysdate-1而不是对日期值进行硬编码。

我尝试过

select TO_CHAR(to_date(
sysdate-1,'DD-Mon-YY'),'YYYY-MM-DD')dates from dual

,并在SQL查询中替换了相同的内容,但出现以下错误,

  

ORA-01861:文字与格式字符串不匹配   01861。00000-“文字与格式字符串不匹配”   *原因:输入中的文字必须与中的文字长度相同              格式字符串(开头的空格除外)。如果              已启用“ FX”修饰符,文字必须完全匹配,              没有多余的空格。   *操作:更正格式字符串以匹配文字。

2 个答案:

答案 0 :(得分:0)

Sysdate是一个返回DATE数据类型的函数;您不会TO_DATE。因此:

SQL> select to_char(sysdate - 1, 'yyyy-mm-dd') result from dual;

RESULT
----------
2019-08-01

SQL>

如果您打算使用日期数据类型,则-如注释所建议-不需要任何TO_something函数:

SQL> select sysdate as today,
  2         sysdate - 1 as yesterday
  3  from dual;

TODAY    YESTERDA
-------- --------
02.08.19 01.08.19

SQL>

这种减法的结果是date数据类型。呈现给您的方式取决于NLS设置。在我的数据库中,它设置为dd.mm.yy。为了以不同的方式呈现,您可以修改设置或使用适当的格式掩码(例如

)应用to_char
SQL> alter session set nls_date_format = 'yyyy-mm-dd';

Session altered.

SQL> select sysdate as today,
  2         sysdate - 1 as yesterday
  3  from dual;

TODAY      YESTERDAY
---------- ----------
2019-08-02 2019-08-01

SQL>

答案 1 :(得分:0)

尽管sysdatedate数据类型,但是Oracle仍然存储时间分量。

您的代码(尝试)删除了时间部分。为此,请使用trunc()

select trunc(sydate - 1)

select trunc(sysdate - interval '1' day)

请注意,当您选择数据并查看数据时,通常会显示时间成分。