【问题标题】:SQL Developer returning different date than SQL Plus command lineSQL Developer 返回与 SQL Plus 命令行不同的日期
【发布时间】: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 设置引起的
  • 有没有办法在不依赖类型转换的情况下动态设置日期?
  • yesterdaytz_yesterday 不是字符串,请使用正确的数据类型。
  • 您的查询在 oracle 12c 中使用 sql developer 运行良好

标签: sql oracle plsql oracle-sqldeveloper sqlplus


【解决方案1】:

不要在 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;
/

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2021-08-09
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多