SQL开发人员返回的日期与SQL Plus命令行不同

SQL开发人员返回的日期与SQL Plus命令行不同,sql,oracle,plsql,oracle-sqldeveloper,sqlplus,Sql,Oracle,Plsql,Oracle Sqldeveloper,Sqlplus,我在sqldeveloper中有以下脚本,但在sqlplus命令行中运行时,它似乎返回了一个无效的日期 set serveroutput on; DECLARE yesterday varchar2(30); tz_yesterday varchar2(30); BEGIN select sysdate - 1 into yesterday from dual; select cast(yesterday as timestamp WITH LOCAL TIME ZONE

我在sqldeveloper中有以下脚本,但在sqlplus命令行中运行时,它似乎返回了一个无效的日期

set serveroutput on;
DECLARE
   yesterday varchar2(30);
   tz_yesterday varchar2(30);
BEGIN
   select sysdate - 1 into yesterday from dual;
   select cast(yesterday as timestamp WITH LOCAL TIME ZONE) into tz_yesterday from dual;
   dbms_output.put_line(yesterday);
   dbms_output.put_line(tz_yesterday);
END;
这是SQL Developer给出的输出,正确无误:

10-OCT-18
10-OCT-18 12.00.00.000000 AM
这就是我在SQL Plus中得到的结果

SQL> l
  1  DECLARE
  2    g_vendor_id NUMBER;
  3    g_product_id NUMBER;
  4    yesterday varchar2(30);
  5    tz_yesterday varchar2(30);
  6    g_user_id NUMBER;
  7   BEGIN
  8    select sysdate - 1 into yesterday from dual;
  9    select cast(yesterday as timestamp WITH LOCAL TIME ZONE) into tz_yesterday from dual;
 10  dbms_output.put_line(yesterday);
 11  dbms_output.put_line(tz_yesterday);
 12* End;
SQL> /
DECLARE
*
ERROR at line 1:
ORA-01843: not a valid month
ORA-06512: at line 9

有人能解释一下这里的差异吗?

不要将日期或时间戳值存储在varchar变量中,请始终使用正确的数据类型:

set serveroutput on;
DECLARE
   yesterday date;
   tz_yesterday timestamp with local time zone;
BEGIN
   yesterday := sysdate - 1;
   tz_yesterday := cast(yesterday as timestamp WITH LOCAL TIME ZONE);
   dbms_output.put_line(yesterday);
   dbms_output.put_line(tz_yesterday);
END;
/

不要将日期或时间戳值存储在varchar变量中,请始终使用正确的数据类型:

set serveroutput on;
DECLARE
   yesterday date;
   tz_yesterday timestamp with local time zone;
BEGIN
   yesterday := sysdate - 1;
   tz_yesterday := cast(yesterday as timestamp WITH LOCAL TIME ZONE);
   dbms_output.put_line(yesterday);
   dbms_output.put_line(tz_yesterday);
END;
/

您依赖的是邪恶的隐式数据类型转换,您的错误很可能是由SQL Developer和SQLplus之间的不同NLS设置引起的。有没有一种方法可以在不依赖类型转换的情况下动态设置日期?
beday
tz_beday
不是字符串,使用正确的数据类型。您的查询在oracle 12c中使用sql Developer运行良好您依赖的是邪恶的隐式数据类型转换,很可能您的错误是由sql Developer和SQLplus之间的不同NLS设置引起的有没有一种方法可以在不依赖类型转换的情况下动态设置日期?
昨天
tz_昨天
不是字符串,请使用正确的数据类型。您的查询在oracle 12c中使用sql developer运行良好