2013-09-25 88 views
2

讓我們創建一個測試表來說明這個問題:TO_CHAR函數返回,Oracle數據庫中的零10g快捷10.2.0.1.0

CREATE TABLE "TMP1" (
    "X" VARCHAR2(256 BYTE) NOT NULL 
) LOGGING NOCOMPRESS NOCACHE; 

INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_0106201395810_0106201395810.csv'); 
INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_31052013155754_31052013155754.csv'); 
INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_02062013130000_02062013130000.csv'); 

現在提出一個要求:

select 
     TMP2.X 
    , TMP2.STARTDATETIME 
    , to_char(TMP2.STARTDATETIME, 'DDMMYYYYHH24MISS') "to_char(StartDateTime)" 
    , TMP2.ENDDATETIME 
    , to_char(TMP2.ENDDATETIME, 'DDMMYYYYHH24MISS') "to_char(EndDateTime)" 
from (
     select 
       "X" 
      , to_date(case length(regexp_substr("X", '\d+', 1, 2, 'i')) 
          when 14 then regexp_substr("X", '\d+', 1, 2, 'i') 
          when 13 then substr(regexp_substr("X", '\d+', 1, 2, 'i'), 0, 8) 
           || '0' || substr(regexp_substr("X", '\d+', 1, 2, 'i'), 9) 
       end, 'DDMMYYYYHH24MISS') StartDateTime 

      , to_date(case length(regexp_substr("X", '\d+', 1, 3, 'i')) 
          when 14 then regexp_substr("X", '\d+', 1, 3, 'i') 
          when 13 then substr(regexp_substr("X", '\d+', 1, 3, 'i'), 0, 8) 
           || '0' || substr(regexp_substr("X", '\d+', 1, 3, 'i'), 9) 
       end, 'DDMMYYYYHH24MISS') EndDateTime 
     from 
      "TMP1" 
) TMP2; 

在在這個查詢中,我們剪出一個子字符串並將其轉換爲日期。然後我們嘗試進行反向轉換,但不起作用。

結果:

enter image description here

to_date功能工作,但功能to_char沒有。

回答

2

您的示例工作正常。

我懷疑Oracle數據庫實例存在問題 - 內部SQL重寫/優化存在一些錯誤,其中Oracle最終執行錯誤重寫的查詢。我會嘗試關閉重寫(查找QUERY REWRITE ENABLED,EXPLAIN_REWRITE,EXPLAIN_PLAN)。

有時重新啓動數據庫幫助。

+0

示例顯示該查詢一般工作正常http://sqlfiddle.com/#!4/2615c/1 – psaraj12