Oracle SQL DATE数据类型返回最新日期为31/12/99,尽管记录较年轻

时间:2016-09-14 05:46:58

标签: sql oracle date

这伤害了我。 Oracle RDMS使用SQL Devloper v.4 我在表中有记录

EMP|DATE_STARTED
JOE|11/08/06
BOB|11/08/14
MAY|31/12/99

DATE_STARTED是DATE数据类型。

我的查询返回31/12/99作为最新日期,但该表有后来的记录(2006年和2014年)。

select max(DATE_STARTED) from EMPLOYEE;

为什么不回复11/08/14?

2 个答案:

答案 0 :(得分:0)

为了让您明白为什么要将31/12/99作为最新日期,请参阅演示。

您的原始查询:

with sample_table (EMP,DATE_STARTED) as (
                      select 'JOE', '11/08/06' from dual
                     union all
                      select 'BOB', '11/08/14' from dual
                      union all
                      select 'MAY', '12/08/99' from dual

                     )
select max(DATE_STARTED)  
  from  sample_table

输出

12/08/99

我添加to_date并再次显示日期。

with sample_table (EMP,DATE_STARTED) as (
                      select 'JOE',to_date('11/08/06','dd-mm-yy')from dual
                     union all
                      select 'BOB', to_date('11/08/14','dd-mm-yy') from dual
                      union all
                     select 'MAY', to_date('12/08/99','dd-mm-yy') from dual

                     )
select DATE_STARTED-- max(DATE_STARTED)  
  from  sample_table

输出:

11-08-2006
11-08-2014
12-08-2099

现在从上面的查询输出中你可以看到oracle返回的结果非常正确。上述结果集的最大日期为12-08-99。 因此,上面的推论是,当您未将年份指定为yyyy时,Oracle会进行隐式转换,并根据其系统参数设置yy值。

要解决您的问题,您需要以下内容。

with sample_table (EMP,DATE_STARTED) as (
                      select 'JOE',to_date('11/08/2006','dd-mm-yy')from dual
                     union all
                      select 'BOB', to_date('11/08/2014','dd-mm-yy') from dual
                      union all
                     select 'MAY', to_date('12/08/1999','dd-mm-yy') from dual

                     )
select max(DATE_STARTED)  
 from  sample_table

输出:

11-08-2014

答案 1 :(得分:0)

解决了所有人。

解决方案: 1.在SQL Developer中转到Tools \ Preferences \ Database \ NLS Parameters \ Date 2更新DD / MON / RR hh24:mi:ss到DD / MON / RR RR hh24:mi:ss

它提供了预期的结果!