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

6bc51xsx  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(161)

这让我很受伤。Oracle RDMS使用SQL Devloper v. 4我在表中有记录

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

字符串
DATE_STARTED是日期数据类型。
我下面的查询返回31/12/99作为最新日期,但表中有更晚的记录(2006和2014)。

select max(DATE_STARTED) from EMPLOYEE;


为什么11/08/14没有回来?

vwoqyblh

vwoqyblh1#

只是为了让你明白为什么你得到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

w7t8yxp5

w7t8yxp52#

解决了,谢谢大家。
解决方法:
1.在SQL Developer中,转到Tools\Preferences\Database\NLS Parameters\Date
1.将DD/MON/RR hh 24:mi:ss更新为DD/MON/RRRR hh 24:mi:ss
它提供了预期的结果!

相关问题