2015-09-16 94 views
0

1),這是爲什麼,這並不工作Oracle日期比較的字符串和日期

select * from table where trunc(field1)=to_date('25-AUG-15','DD-MON-YY'); 

select * from table where trunc(field1)=to_date('25/Aug/15','DD/MON/YY'); 

排在上述情況下返回。

那麼,這是否意味着無論日期在field1中的日期是什麼格式,如果它是有效日期並且與8月25日匹配,它將被返回(它不會在意在我們指定的格式說明符查詢的右側即DD-MON-YY或DD/MON/YY或其他)?

2),但作爲comparsion字符串完全工作:如進行準確的比較返回

select * from table where to_char(field1)=to_char(to_date  

('25/AUG/15','DD/MON/YY'), 'DD/MON/YY'); 

沒有行。

我已經FIELD1爲'25 -AUG-15' (儘管它可以被看作做不同的ALTER會議NLS_DATE_FORMAT ...)

FIELD1是DATE類型

的理解這個任何幫助表示讚賞特別是關於點1

+0

所以打印出to_char函數的值,看看它們是什麼。你想做什麼? – OldProgrammer

+0

如果您在第一次投射中指定相同的格式,第二個查詢的行爲是否相同? 'to_char(field1,'DD/MON/YY')' –

+0

我的觀點是,爲什麼第一種情況下返回的結果不考慮格式說明符,即它只返回8月25日的結果,但它並不關心日期格式 – user1502952

回答

3

DATE數據類型沒有格式 - 它只是一個數字。因此,2015年8月25日的DATE與2015年5月25日的DATE以及2015-08-15的DATE相同,因爲它與DATE相同。

字符串另一方面是字符的集合,所以'25-Aug-2015'明顯不同於'25/AUG/15'

在第一個示例中,您正在比較DATE值。在第二個例子中,你正在比較字符串。

+0

謝謝,爲了明確的解釋 – user1502952

2

所以,你有型日期的場 2015年8月,第25次價值,但它可能以不同的方式,其實什麼被命名爲格式進行可視化。

The DATE has format! DATE具有由Oracle定義的隱式格式,在您的情況下爲DD-MON-YY,因爲您將字段視爲25-AUG-15。

您可以選擇您的數據,而無需TO_DATE轉換,只是匹配這個默認格式這樣的:

select * from table where trunc(field1)='25-AUG-15'; 

事實上,它是不推薦的,因爲如果有人將更改默認的格式,Oracle會不能理解你要告訴他一個日期

所以TO_DATE轉換在這種情況下:

SELECT * FROM表,其中 TRUNC(FIELD1)= TO_DATE('25/AUG/15' , 'DD/MON/YY');

用於指定你想告訴到Oracle的DATE類型與2015年8月25日的價值,使用不同勢格式,指定爲第二個參數。 (在這種情況下爲DD/MM/YY)。

+0

謝謝,只是爲了增加這一點,你能幫助,爲什麼這兩個工作select * from table where trunc(field1)= to_date('25 -AUG-15','DD-MON-YY ')並從表中選擇* trunc(field1)= to_date('25 -AUG-15','DD-Mon-YY');因爲我相信第二個查詢輸入25-Aug-15應該只能工作 – user1502952

+0

因爲你指定**相同的**值,只是使用不同的格式,這兩種情況下oracle的內部格式無關緊要你指定**日期** 2015年8月25日。 –

+0

是的,這是正確的,但格式有效的25-AUG-15是'DD-MON-YY',而不是'DD-MON-YY'(這是爲25-Aug-15),這不是格式版本在這裏重要嗎?例如:我不能使用to_date('25 -AUG-15','MMDDYY'),因爲這會拋出錯誤 – user1502952