select to_date('07/09/14','yyyy-mm-dd') from dual;
正在恢復14-SEP-07
混亂使用to_date函數來確認日期格式
我期待它拋出一個異常的日期和要求的格式是不一樣的。其次,我們在輸入日期中進行了縮減,並以格式進行了宣傳。
有人可以告訴我如何確認輸入值是否爲提供的格式。
select to_date('07/09/14','yyyy-mm-dd') from dual;
正在恢復14-SEP-07
混亂使用to_date函數來確認日期格式
我期待它拋出一個異常的日期和要求的格式是不一樣的。其次,我們在輸入日期中進行了縮減,並以格式進行了宣傳。
有人可以告訴我如何確認輸入值是否爲提供的格式。
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.
非常感謝你約書亞。正則表達式幫助我添加檢查 - ,以及輸入日期中的位置數量,然後將其提供給to_date以顯示該掩碼。一百萬。 –
to_date
是在試圖將輸入轉換相對寬鬆字符串使用提供的格式掩碼。它通常不涉及字符串中的特定分隔符或格式掩碼 - 如果需要,您的字符串可以使用破折號或斜線,或者是heck,asterixes。當然,這可能意味着你會得到意想不到的結果。在這種情況下,例如,創建的date
在第7年(即2007年前)。這是Oracle的有效日期,但除非您存儲有關古羅馬的數據,否則極可能不會成爲您期望的日期。
對於「確認輸入值是否爲所提供的格式」,這到底意味着什麼?根據你在找什麼,你可能想要使用正則表達式。
嗨,賈斯汀,謝謝你指出分隔符和正則表達式的想法。通過「如何確認輸入值是否爲所提供的格式」,我的意思是我想查找日期是2007-09-14,如果掩碼是yyyy-mm-dd或引發異常。必須使用正則表達式來確保在我調用to_date之前,像joshua所示的那樣。 –
TO_DATE()
只接受一個字符串並將其轉換爲您提供的給定格式的日期/時間。如果找不到確切的格式,它將盡力確定它可能是什麼。根據您的'yyyy-mm-dd'
格式,Oracle推斷07
是一年,而14
是一天。
如果有任何基於您的功能需求,您必須編寫自己的函數來引發預期異常或類似問題來處理該問題。
因此,當您選擇生成日期時,顯示的格式實際上基於您的NLS_DATE_FORMAT系統參數,該參數提供了生成日期。
我認爲這隻回答你的一些問題,但請查看官方文檔http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924 – Jonny
**' TO_DATE()'**只接收一個字符串並將其轉換爲您提供的給定格式的日期/時間。如果找不到確切的格式,它將盡力確定它可能是什麼。鑑於你的'yyyy-mm-dd''格式,Oracle推斷'07'是一年,而'14'是一天(http://docs.oracle.com/cd/E11882_01/server.112 /e26088/functions203.htm#SQLRF06132)。如果有任何基於您的功能需求,您必須編寫自己的函數來引發預期異常或類似問題來處理此問題。 –