两个查询之间有什么区别?

时间:2017-02-20 05:26:05

标签: sql oracle

这里的表名是employees,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')

3 个答案:

答案 0 :(得分:2)

评论太久了。

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

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT'

当您在日期列上使用TO_DATE()时,会发生什么,Oracle将hire_date渲染为与NLS_DATE_FORMAT匹配的日期字符串,然后才应用您指定的格式mdel。 / p>

说,您的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()

答案 1 :(得分: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

答案 2 :(得分:0)

在第一个查询中,您的employee_date列不是DATE字段。它可能是一个VARCHAR字段,因此您使用to_date函数将其转换为DATE字段。 &#39; DD-MM-YYYY&#39;是VARCHAR字段所在的日期格式。

在第二个查询中,hire_date是DATE字段,因此无需转换