2012-12-18 66 views
2

我在查詢下面的sql。 請幫幫我。
TO_DATE爲不同的格式掩碼返回不同的日期?

1)TO_DATE(SYSDATE, 'DD月YYYY')這會給日期對象而不時間(可以是時間是00:00)。
我正確嗎?如果不是,我將如何獲得沒有時間的只有日期對象?
2)從上面的查詢看來,to_date(sysdate,'yyyy/mm/dd')大於to_date(sysdate,'DD MONTH YYYY')。爲什麼?



更新


1)我在上面URL的目的是找出to_date函數將只返回日期(或隨着時間)雖然格式「DD月YYYY」不提及時間字符(hh:mm ..)。
2)從我得到的答覆to_date將返回日期與時間總是雖然我們沒有提到時間字符。
3)最後得到的只有我們應該使用TRUNC DATE()/ TO_DATE(TO_CHAR(SYSDATE, 'MM-DD-YYYY'), 'MM-DD-YYYY')

檢查以下

select to_char(trunc(sysdate), 'yyyy/mm/dd hh24:mi:ss'), 
to_char(to_date(to_char(sysdate, 'yyyy-MM-dd'),'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') 
from dual; 

- > hh24:24對於獲取00:00格式很重要。

+1

絕對不需要將已經是日期的'sysdate'轉換爲日期。 –

+0

爲什麼不嘗試**時間戳**最好是在哪裏 – KingRider

回答

8

你剛剛在腳下開槍自殺。其被稱爲隱式數據類型轉換。

沒有TO_DATE(date)(這就是你要求的),所以oracle已經將你的查詢轉換爲TO_DATE(TO_CHAR(sysdate), 'DD MONTH YYYY'),其中TO_CHAR(sysdate)將選擇默認的NLS格式掩碼。取決於您的默認掩碼(請參閱NLS_SESSION_PARAMETERS),您的第一位可能已解決到0012年和第二年到0018年。所以0012小於0018.

如果要截斷sysdate,那麼只需執行trunc(sysdate)

+0

trunc(sysdate)只會返回沒有時間的日期? –

+0

@KanagaveluSugumar是的。時間將是00:00:00。它的DISPLAYS完全取決於客戶端使用的格式掩碼。 – DazzaL

+1

我可以使用to_date(to_char(sysdate,'mm-dd-yyyy'),'mm-dd-yyyy')截斷時間嗎? –

0

Ad。 1.在我的測試環境中我得到了最新與時間:

select to_date('15 Maj 1998', 'DD MONTH YYYY') from dual; 

結果(波蘭設置):

1998-05-15 00:00:00 

廣告。 2.爲什麼在致電to_date時使用sysdate?該函數需要以給定格式描述日期時間的字符串。在我的環境中,這種通話失敗。你可能有其他NLS設置,所以sysdate可以轉換爲字符串,這樣的字符串給你奇怪的結果。使用字符串,而不是sysdate

0

如果您想在選擇SYSDATE時看到時間部分。您可以在發出SELECT語句之前設置NLS_DATE_FORMAT。

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss'; 

在集成開發環境(今天,PLSQL開發,SQL開發人員等)NLS_DATE_FORMAT可以永久設置爲你執行的SELECT語句都可以使用。在這種情況下,您不需要在SELECT之前運行ALTER SESSION命令。