2013-08-22 271 views
2

我們一直在尋找一些遺留代碼,並發現函數檢查date(VARCHAR2)是否以正確的格式'YYYY-MM-DD HH24:MI:SS'傳遞。它使用簡單的構建體有效的日期格式檢查Oracle - 奇怪的行爲

function IS_CORRECT_TIMESTAMP(P_EVENT_TIMESTAMP varchar2) 
    return number is 
    V_TIMESTAMP timestamp; 
    begin 
    select TO_TIMESTAMP(NVL(P_EVENT_TIMESTAMP, '1'), 
         'YYYY-MM-DD HH24:MI:SS') 
     into V_TIMESTAMP 
     from DUAL; 
    return 1; 
    exception 
    when others then 
     return - 1; 
    end; 

問題是,當我通過例如'22 -AUG-13' 值,則它不會引發任何異常。 這可能是什麼原因?

感謝您的意見。

+2

Oracle嘗試(太硬有時)是有幫助的,並[將字符串轉換爲與一些靈活性日期](http://docs.oracle.com/cd/E11882_01/server.112/e26088 /sql_elements004.htm#sthref405)。你已經被告知使用'FX'修飾符來防止這種情況發生。僅供參考,您的型號'22-AUG-13'變成了'0022-08-13 00:00:00',但仍然有效;如果你使用'RRRR'而不是'YYYY',它會是'2022-08-13 00:00:00',這也是有效的。儘管如此,某些日期仍然會失敗。 '22-AUG-99'。 –

回答

5

FX格式模型修改器可以用於需要一個字符串與格式模式之間的精確匹配:

select TO_TIMESTAMP(P_EVENT_TIMESTAMP, 'FxYYYY-MM-DD HH24:MI:SS') 
    into V_TIMESTAMP 
    from DUAL; 

而且,可以防止背景下通過不查詢DUAL表以字符串轉換開關到timestamp數據類型:

V_TIMESTAMP := TO_TIMESTAMP(P_EVENT_TIMESTAMP, 'FxYYYY-MM-DD HH24:MI:SS'); 
+0

非常感謝!我不知道「Fx」指令,非常方便 –