在我的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”修饰符,文字必须完全匹配, 没有多余的空格。 *操作:更正格式字符串以匹配文字。
答案 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)
尽管sysdate
是date
数据类型,但是Oracle仍然存储时间分量。
您的代码(尝试)删除了时间部分。为此,请使用trunc()
:
select trunc(sydate - 1)
或
select trunc(sysdate - interval '1' day)
请注意,当您选择数据并查看数据时,通常会显示时间成分。