2017-02-20 71 views
0

这里的表名是雇员,hire_date是日期类型的列。两个查询都应该给出相同的输出,但输出id不同。两个查询有什么区别?

select hire_date from employees 
where to_date(hire_date,'dd-mm-yyyy') < to_date('01-01-2007','dd-mm-yyyy') 

select hire_date from employees 
where hire_date < to_date('01-01-2007','dd-mm-yyyy') 
+0

hire_date的数据类型是什么? – dsolimano

+0

请提供表格结构,特别提一下'hire_date'列。 – Rachcha

+0

如果'hire_date'是'DATE'(或'TIMESTAMP'),第一个是明显错误 –

回答

0

我认为这将有助于你知道其中的差别。你在第二个查询中指定了你需要的格式。默认情况下,hire_date的格式如下

SQL> select first_name, last_name, hire_date 
    2 from employee 
    3 order by hire_date desc, last_name, first_name; 

FIRST_NAME  LAST_NAME  HIRE_DATE 
——————————————— ——————————————— ————————————— 
Theresa   Wong    27-FEB-10 
Thomas   Jeffrey   27-FEB-10 
mark    leblanc   06-MAR-09 
michael   peterson   03-NOV-08 
Roger   Friedli   16-MAY-07 
Betsy   James   16-MAY-07 
Matthew   Michaels   16-MAY-07 
Donald   Newton   24-SEP-06 
Frances   Newton   14-SEP-05 
Emily   Eckhardt   07-JUL-04 



SQL> select first_name, last_name, TO_CHAR(hire_date, 'YYYY-MM-DD') hire_date 
    2 from employee 
    3 order by hire_date desc, last_name, first_name; 

FIRST_NAME  LAST_NAME  HIRE_DATE 
——————————————— ——————————————— ————————————— 
Thomas   Jeffrey   2010-02-27 
Theresa   Wong    2010-02-27 
mark    leblanc   2009-03-06 
michael   peterson   2008-11-03 
Roger   Friedli   2007-05-16 
Betsy   James   2007-05-16 
Matthew   Michaels   2007-05-16 
Donald   Newton   2006-09-24 
Frances   Newton   2005-09-14 
Emily   Eckhardt   2004-07-07 
+0

我想有人编辑qs – venky513

+0

兄弟先看看我的查询。 –

0

在第一个查询中,列hire_date不是DATE字段。它可能是一个VARCHAR字段,因此您可以使用to_date函数将它转换为DATE字段。 'dd-mm-yyyy'是VARCHAR字段的日期格式。

在第二查询,HIRE_DATE是日期字段,因此转换是不必要的

+0

这里是表名员工,并且有一个列日期类型的hire_date。这两个查询应该产生相同的输出,但我不明白他们为什么会产生不同的输出。 –

+0

hire_date列的默认日期格式是什么,即什么是您选择hire_date时的输出格式? –

2

太长而无法评价。

使用以下查询找到您的默认NLS_DATE_FORMAT

SELECT value 
FROM nls_session_parameters 
WHERE parameter = 'NLS_DATE_FORMAT' 

当您使用,TO_DATE()在日期列,发生的事情是,甲骨文呈现hire_date为日期字符串匹配的NLS_DATE_FORMAT,然后才指定您的格式MDEL适用。

说,你NLS_DATE_FORMAT'MM-DD-YYYY' ...

TO_DATE(hire_date,'DD-MM-YYYY')会被执行,TO_DATE(TO_CHAR(hire_date,'MM-DD-YYYY'),'DD-MM-YYYY')

你可以看到在格式MM-DD to DD-MM的区别..这是为你的数据冲突的可能性 。

大多数情况下,它会以例外ORA-01843: not a valid month结束。这取决于下面的数据。

作为一种标准做法,千万不要在日期栏中使用TO_DATE()