2014-02-15 24 views
-2

我輸入爲2011/11/13 00:00:00。所以我做了這樣的查詢:從視圖中選擇數據會導致錯誤

select * from xxcust_pfoa434p_vw 
where week_ending_date = to_date(substr(:value,1,10),'YYYY/MM/DD') 

當查詢其他表時,相同的語句給出正確的結果。但拋出錯誤,當我查詢這與視圖xxcust_pfoa434p_vw

我有一個觀點xxcust_pfoa434p_vw有一個列date_ending_date日期數據類型。 該列中的值是像3/2/2014,12/25/2011 i.e. MM/DD/YYYY

即使

select * from xxcust_pfoa434p_vw where week_ending_date='3/2/2014' 

也給 ORA-01843:不是有效的月份。這個錯誤的原因是什麼。

+0

http://www.dbforums.com/oracle/1215287-ora-01843-not-valid-month-not-all-should.html – StackTrace

回答

0

即使你看到這種格式的格式化日期 - 它只是一個可視化表示,當oracle處理你的查詢時,它會自動將你給出的字符串轉換成它自己的內部表示。

它始終是更好地使用正確的SQL一個YYYY-MM-DD:

爲3月2日:select * from xxcust_pfoa434p_vw where week_ending_date = to_date('2014-03-02', 'YYYY-MM-DD')

爲2月3日:select * from xxcust_pfoa434p_vw where week_ending_date = to_date('2014-02-03', 'YYYY-MM-DD')

這符合SQL標準並且不會在DD/MM/YYYYMM/DD/YYYY之間產生混淆

standard只是引用:

還有就是<日期時間字段> S的重要性進行排序。這個 從最重要到最不重要:年,月,日, HOUR,MINUTE和SECOND。

UPDATE:這是非常好的主意總是使用to_date功能來指定確切格式,避免扶養任何種類的本地化設置

+0

我試了兩次,並得到錯誤「文字不匹配格式字符串」 – Gayathri

+0

@Gayathri看起來像你必須使用to_date,檢查了這一點:http://stackoverflow.com/questions/13518506/oracle-literal-does-not-match-format-string-error –

+0

@Lashene我試過你,但didn 't work select * from xxcust_pfoa434p_vw where week_ending_date = to_date('2013/11/13','YYYY/MM/DD') – Gayathri

0
select * from xxcust_pfoa434p_vw 
where week_ending_date=to_date('03/02/2014','MM/DD/YYYY'); 
+0

Sai,my query select * from xxcust_pfoa434p_vw where week_ending_date = to_date(substr(:value,1,10 ),「YYYY/MM/DD」)與其他表格無關,但與視圖無關。我試過你提供的查詢。獲取錯誤「ORA-01841:(全年)必須介於-4713和+9999之間,而不是0」 – Gayathri

+0

Gayathri,首先在您創建視圖的表格中提供日期格式。嘗試在視圖的where條件中使用相同的日期格式。 – Sai

+0

還有一件事情使用to_date(trim(:value),'YYYY/MM/DD')「 – Sai

1

你說

「同樣的語句使當查詢其他 表時會出現適當的結果,但是當我根據查詢查詢時會拋出錯誤 xxcust_pfoa434p_vw「

很明顯,問題在於這個觀點。也說

「[視圖]具有日期數據類型的一列week_ending_date。在該列中的值是 樣3/2/2014,12 /二千零十一分之二十五即MM/DD/YYYY」

如果系統的默認日期掩碼是MM/DD/YYYY,那麼這些值只會顯示。這很容易檢查查詢

select * from V$NLS_PARAMETERS 
where parameter = 'NLS_DATE_FORMAT'; 

就我個人而言,我的錢是在該列不是日期列。 ORA-01841總是表示oracle試圖將一個字符串強制轉換爲日期,並找到一個不符合顯式或默認格式掩碼的值。再加上所謂的日期'3/2/2014'缺乏前導零,這也是可疑的。

我認爲寫這個視圖的人決定修正week_ending_date的格式,所以部署TO_CHAR來呈現一個字符串而不是日期數據類型。 SQL * Plus中的DESC或查看ALL_VIEWS中的TEXT文本將顯示答案。

相關問題