SQL Developer错误地显示日期

时间:2018-07-27 13:48:32

标签: oracle date oracle-sqldeveloper

使用我的SQL Developer版本18.1.0.095内部版本095.1630,我在表中放置了一个带有以下值的日期:'0001-01-01'。

但是在确认插入之后,我要求进行选择,并且返回中显示'0001-01-03'。

在SQL Developer版本3.2.20.09 Build MAIN-09.87中使用相同的命令, 返回值就像我预期的那样,“ 0001-01-01”。

SQL Developer版本18.1.0.095内部版本095.1630

DATRATTIT  TRUNC(DATR TO_TIMESTAMP(DATRATTIT)         COUNT(*)
---------- ---------- ----------------------------- ---------- 
0001-01-03 0001-01-03 0001-01-03 00:00:00,000000000     237069

SQL Developer版本3.2.20.09生成MAIN-09.87

DATRATTIT  TRUNC(DATRATTIT) TO_TIMESTAMP(DATRATTIT)          COUNT(*)
---------- ---------------- ------------------------------ ----------
0001-01-01 0001-01-01       0001-01-01 00:00:00,000000000      237069

这是配置问题吗?与NLS设置有关?还有这个问题的人吗?

1 个答案:

答案 0 :(得分:4)

有趣的是,几天前我看到了类似的内容,但是并没有进一步探索它。您可以通过以下方式看到相同的问题:

alter session set nls_date_format = 'SYYYY-MM-DD';

select date '0001-01-01' from dual;

DATE'0001-0
-----------
 0001-01-03

但是,这似乎在当前的SQL Developer中是一个错误-我在18.2.0.183中看到它-并且我相信您表中的数据还可以-当您使用时,“只是”无法正确显示依靠通过NLS_DATE_FORMAT隐式转换为字符串。

似乎 与公历以及SQL Developer如何从内部表示形式转换有关。此查询查看the Gregorian calendar change前后的日期,并显示客户端格式的值(不正确),显式转换为字符串并转储内部表示形式:

with t (d) as (
  select date '1582-10-21' - level * interval '1' day from dual connect by level <= 10
)
select d, to_char(d, 'SYYYY-MM-DD'), dump(d, 1016) as dumped from t;

D           TO_CHAR(D,' DUMPED                                  
----------- ----------- ----------------------------------------
 1582-10-20  1582-10-20 Typ=13 Len=8: 2e,6,a,14,0,0,0,0         
 1582-10-19  1582-10-19 Typ=13 Len=8: 2e,6,a,13,0,0,0,0         
 1582-10-18  1582-10-18 Typ=13 Len=8: 2e,6,a,12,0,0,0,0         
 1582-10-17  1582-10-17 Typ=13 Len=8: 2e,6,a,11,0,0,0,0         
 1582-10-16  1582-10-16 Typ=13 Len=8: 2e,6,a,10,0,0,0,0         
 1582-10-15  1582-10-15 Typ=13 Len=8: 2e,6,a,f,0,0,0,0          
 1582-09-24  1582-10-04 Typ=13 Len=8: 2e,6,a,4,0,0,0,0          
 1582-09-23  1582-10-03 Typ=13 Len=8: 2e,6,a,3,0,0,0,0          
 1582-09-22  1582-10-02 Typ=13 Len=8: 2e,6,a,2,0,0,0,0          
 1582-09-21  1582-10-01 Typ=13 Len=8: 2e,6,a,1,0,0,0,0          

如您所见,从1582-10-15开始的日期是可以的,之前的日期是错误的;而且根据您返回的距离,它们似乎以不同的方式出现了错误。在脚本输出和结果网格中看起来都一样。

对同一数据库但通过SQL * Plus运行相同的查询显示:

D           TO_CHAR(D,' DUMPED
----------- ----------- ----------------------------------------
 1582-10-20  1582-10-20 Typ=13 Len=8: 2e,6,a,14,0,0,0,0
 1582-10-19  1582-10-19 Typ=13 Len=8: 2e,6,a,13,0,0,0,0
 1582-10-18  1582-10-18 Typ=13 Len=8: 2e,6,a,12,0,0,0,0
 1582-10-17  1582-10-17 Typ=13 Len=8: 2e,6,a,11,0,0,0,0
 1582-10-16  1582-10-16 Typ=13 Len=8: 2e,6,a,10,0,0,0,0
 1582-10-15  1582-10-15 Typ=13 Len=8: 2e,6,a,f,0,0,0,0
 1582-10-04  1582-10-04 Typ=13 Len=8: 2e,6,a,4,0,0,0,0
 1582-10-03  1582-10-03 Typ=13 Len=8: 2e,6,a,3,0,0,0,0
 1582-10-02  1582-10-02 Typ=13 Len=8: 2e,6,a,2,0,0,0,0
 1582-10-01  1582-10-01 Typ=13 Len=8: 2e,6,a,1,0,0,0,0

客户也正确解释了1582-10-15之前的日期。

我不认为您可以进行任何更改来解决此问题;我的会话NLS_CALENDAR已经是GREGORIAN,选择跳过首选项中的NLS设置没有任何区别。

我目前唯一的解决方法是在查询中显式设置日期值。

但是您应该针对SQL Developer向Oracle提出服务请求,以便对其进行正确调查。

  

错误28093149:日期错误地返回为01/01/0001-返回为03/01/0001

因此您不需要提出服务请求...希望它将在18.3中得到解决。

似乎它也出现在SD论坛上,例如here,其中引用了该错误号。