这里的表名是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')
答案 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字段,因此无需转换