2017-02-20 101 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()