2014-07-14 67 views
1
select to_date('07/09/14','yyyy-mm-dd') from dual; 

正在恢復14-SEP-07混亂使用to_date函數來確認日期格式

我期待它拋出一個異常的日期和要求的格式是不一樣的。其次,我們在輸入日期中進行了縮減,並以格式進行了宣傳。

有人可以告訴我如何確認輸入值是否爲提供的格式。

+0

我認爲這隻回答你的一些問題,但請查看官方文檔http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924 – Jonny

+1

**' TO_DATE()'**只接收一個字符串並將其轉換爲您提供的給定格式的日期/時間。如果找不到確切的格式,它將盡力確定它可能是什麼。鑑於你的'yyyy-mm-dd''格式,Oracle推斷'07'是一年,而'14'是一天(http://docs.oracle.com/cd/E11882_01/server.112 /e26088/functions203.htm#SQLRF06132)。如果有任何基於您的功能需求,您必須編寫自己的函數來引發預期異常或類似問題來處理此問題。 –

回答

0

REGEXP_LIKE可以稍微做到這一點。請注意,這是基本的,因爲它會接受像2014-0-32這樣的值。但是,無論您在代碼中接下來做什麼,這些瘋狂值都會失敗,例如to_date()

SELECT 'Yes, valid boss.' is_valid FROM DUAL 
    WHERE regexp_like('07/09/14','^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$'); 

no rows selected 

SELECT 'Yes, valid boss.' is_valid FROM DUAL 
    WHERE regexp_like('2014-07-09','^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$'); 

IS_VALID 
---------------- 
Yes, valid boss. 

SELECT 'Yes, valid boss.' is_valid FROM DUAL 
    WHERE regexp_like('2014-7-9','^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$'); 

IS_VALID 
---------------- 
Yes, valid boss. 

編輯:如果你到PL/SQL,你可以做一個正則表達式匹配,並拋出自己的異常......

DECLARE 
    v_is_valid INTEGER; 
BEGIN 
    SELECT count(*) INTO v_is_valid FROM DUAL 
    WHERE regexp_like('07/09/14','^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$'); 
    IF v_is_valid = 0 THEN 
    raise_application_error (-20400, 'Exception: date was given in the wrong format.'); 
    END IF; 
END; 
/

* 
ORA-20400: Exception: date was given in the wrong format. 
+0

非常感謝你約書亞。正則表達式幫助我添加檢查 - ,以及輸入日期中的位置數量,然後將其提供給to_date以顯示該掩碼。一百萬。 –

1

to_date是在試圖將輸入轉換相對寬鬆字符串使用提供的格式掩碼。它通常不涉及字符串中的特定分隔符或格式掩碼 - 如果需要,您的字符串可以使用破折號或斜線,或者是heck,asterixes。當然,這可能意味着你會得到意想不到的結果。在這種情況下,例如,創建的date在第7年(即2007年前)。這是Oracle的有效日期,但除非您存儲有關古羅馬的數據,否則極可能不會成爲您期望的日期。

對於「確認輸入值是否爲所提供的格式」,這到底意味着什麼?根據你在找什麼,你可能想要使用正則表達式。

+0

嗨,賈斯汀,謝謝你指出分隔符和正則表達式的想法。通過「如何確認輸入值是否爲所提供的格式」,我的意思是我想查找日期是2007-09-14,如果掩碼是yyyy-mm-dd或引發異常。必須使用正則表達式來確保在我調用to_date之前,像joshua所示的那樣。 –

0

TO_DATE()只接受一個字符串並將其轉換爲您提供的給定格式的日期/時間。如果找不到確切的格式,它將盡力確定它可能是什麼。根據您的'yyyy-mm-dd'格式,Oracle推斷07是一年,而14是一天。

如果有任何基於您的功能需求,您必須編寫自己的函數來引發預期異常或類似問題來處理該問題。

因此,當您選擇生成日期時,顯示的格式實際上基於您的NLS_DATE_FORMAT系統參數,該參數提供了生成日期。