2017-07-24 27 views
0

當的鉅額表的概念(2B +行)某些分區證明工作,我們想出了select語句的一些奇怪的行爲此查詢:甲骨文12C PARTITION BY距離間隔一個月ORA-01841

select * from date_test 
WHERE (
JOURNAL_DATE < TO_DATE('20061201','YYYYMMDD') 
OR 
JOURNAL_DATE > TO_DATE('20061231','YYYYMMDD') 
) ; 

我得到以下錯誤:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0
*Cause: Illegal year entered
*Action: Input year in the specified range

的 「有趣」 的日ing是,如果您刪除OR的任一側的一個子句,查詢似乎會啓動OK。當然查詢在非分區表中正常工作。

任何幫助或指針,不勝感激。

+0

使用? –

+1

試試這個(無證)提示'/ * + NO_EXPAND_TABLE(date_test)* /' –

+0

Oracle版本是12.1.0.2.170117。 –

回答

1

這看起來像bug,可能是20961659或其親屬之一。您可以通過改變the optimizer_features_enable setting,你可以做你的查詢的一部分來解決它,如果你不希望它應用更加廣泛的更多信息:

select /*+ optimizer_features_enable('12.1.0.1') */ * from date_test 
WHERE (
JOURNAL_DATE < TO_DATE('20061201','YYYYMMDD') 
OR 
JOURNAL_DATE > TO_DATE('20061231','YYYYMMDD') 
) ; 

在12.1.0.2.170117我看到相同的您的原始查詢出錯;但有了這個提示,它按預期工作。

當然,要小心副作用,如果有疑問,您可以隨時通過Oracle支持提出服務請求。

Read more in the documentation,並在My Oracle Support中探索與此錯誤相關的條目。


在它看來,你也可以得到你想要的東西通過顛倒邏輯使用一個具有包容性的日期範圍與and,並否定這種情況下,與not;但你需要停止優化工具更改回來 - 這可能又是矯枉過正,但a no_query_transformation hint似乎這樣的伎倆:

select /*+ no_query_transformation */ * from date_test 
WHERE NOT (
JOURNAL_DATE >= TO_DATE('20061201','YYYYMMDD') 
AND 
JOURNAL_DATE <= TO_DATE('20061231','YYYYMMDD') 
) ; 

no_expand hint似乎並不在這裏幫助;儘管正如@WernfriedDomscheit建議的那樣,未記錄的no_expand_table提示似乎有幫助。

0

嘗試使用> =

select * from date_test WHERE TO_DATE('20061201','YYYYMMDD') OR JOURNAL_DATE >= TO_DATE('20061231','YYYYMMDD') ) ;( JOURNAL_DATE <

或者到底哪個版本和補丁級別,你就

之間

where JOURNAL_DATE between to_date('20061201','YYYYMMDD') and TO_DATE('20061231','YYYYMMDD')

+0

您的第一個查詢格式不正確,但如果意圖只是將'>'更改爲'> =',那麼它仍然是錯誤的。第二個查詢不會出錯,但是邏輯相反;如果你讓它「不在」之間,那麼它再次出錯。 –

+0

不能使用<= or > =因爲它將使查詢的目的無效。代碼來自PeopleSoft應用引擎,我應該在where子句中添加一個額外的括號,因爲它在原始查詢上。感謝您指出。 –

+0

嘗試將間隔更改爲20061202和20061230 以檢查是否因間隔 發生錯誤,如果需要修改表分區 – waleedaz