【发布时间】:2018-10-11 19:33:42
【问题描述】:
我在 SQL Developer 中有以下脚本,但在 SQL Plus 命令行中运行时似乎返回了无效日期。
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
有人可以解释这里的差异吗?
【问题讨论】:
-
您依赖于邪恶的隐式数据类型转换,很可能您的错误是由 SQL Developer 和 sqlplus 之间的不同 NLS 设置引起的
-
有没有办法在不依赖类型转换的情况下动态设置日期?
-
yesterday和tz_yesterday不是字符串,请使用正确的数据类型。 -
您的查询在 oracle 12c 中使用 sql developer 运行良好
标签: sql oracle plsql oracle-sqldeveloper sqlplus