2014-03-31 82 views
2

我有一個使用間隔分區(每月分區)的提要表將分區鍵作爲表的日期字段保存3年的歷史數據。我們需要刪除3年以上(36個月)的分區。根據Oracle中的日期字段提取分區的實際日期信息

在刪除分區時,我想向用戶顯示一條消息,告訴用戶要刪除的分區的月份和年份。要獲取月份信息,我必須使用USER_TAB_PARTITIONS表的HIGH_VALUE列,因爲partition_name是系統生成的,如'SYSP ###',它不提供月份信息。

在HIGH_VALUE列中的值是這樣的:

TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 

我使用SUBSTR/REGEXP_SUBSTR是無法提取 '2011-01-01' 從上面的字符串。

我用下面的查詢只是爲了檢查我是否能提取所需的信息:

select REGEXP_SUBSTR('TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')',10, 10) FROM DUAL; 

The error I am getting is: 
Error: ORA-01036: illegal variable name/number 

我不知道如果我在這裏做了一些愚蠢的錯誤。

會讚賞你的協助/任何指針/替代方式來實現這一點。

在此先感謝。

問候,

維諾德

+0

你能發佈完整的sql語句嗎? –

+0

是的。 select REGEXP_SUBSTR('TO_DATE('2011-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR = GREGORIAN')',10,10)FROM DUAL; 我得到的錯誤是: –

+0

請更新您的問題,而不是添加評論。 –

回答

3

你在做什麼並沒有多大意義了我。

您嘗試在date而不是varchar上應用正則表達式。

你可以試試這個:

select to_char(TO_DATE(' 2011-01-01 00:00:00' 
         , 'SYYYY-MM-DD HH24:MI:SS' 
         , 'NLS_CALENDAR=GREGORIAN' 
         ) 
       , 'yyyy-mm-dd' 
      ) 
FROM DUAL 

如果你想提取從語句中的值試試這個:

select substr('TO_DATE('' 2011-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')',10, 11) 
FROM DUAL 

注意我在發言改變了過去1011了。

+0

非常感謝! 這並不符合我的想法:( –

+0

感謝您糾正我嘗試使用(')作爲轉義字符的查詢。 –

+0

不是現在。這應該沒問題。但是,如果我卡在其他地方,絕對可以接觸到你。再次感謝。 –

相關問題