String-to-Date Conversion Rules的允許(被施加而沒有任何其他修飾)附加格式規則。所以:
MM
也匹配MON
和MONTH
;
MON
匹配MONTH
(反之亦然);
RR
匹配RRRR
;和
- 標點符號是可選的。
所以:
SELECT TO_DATE('10AUGUST2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE('10AUGUST2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE('10AUGUST2016', 'DD-MONTH-RR') FROM DUAL UNION ALL
SELECT TO_DATE('10AUG2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE('10AUG2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE('10AUG2016', 'DD-MONTH-RR') FROM DUAL;
所有生成的日期2016-08-10T00:00:00
。
您可以通過使用FX
format model
FX
格式確切防止這一點。此修飾符指定精確匹配用於TO_DATE
函數的字符參數和日期時間格式模型:
標點和在字符參數引用文字必須完全匹配的格式模型的相應部分(除了情況)。
字符參數不能有額外的空格。如果沒有FX
,Oracle會忽略額外的空白。
字符參數中的數字數據必須具有與格式模型中相應元素相同的位數。如果沒有FX
,字符參數中的數字可以忽略前導零。
當啓用FX
時,您也可以通過使用FM
修飾符來禁用前導零的檢查。
如果字符參數的任何部分違反了任何這些條件,那麼Oracle會返回一條錯誤消息。
然後:
SELECT TO_DATE('10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
給出:ORA-01858: a non-numeric character was found where a numeric was expected
,並且其中一個確切的圖案發現匹配只能相匹配(儘管仍然RR
將匹配RRRR
)。
我猜隱含轉換正在發生?
是的,oracle默認使用TO_DATE('10AUGUST2016', NLS_DATE_FORMAT)
來進行轉換。
如果你使用:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
然後您的插入會失敗。
來源
2017-05-03 11:31:59
MT0
是的'插入到mytable的值('10');'會拋出'ORA-01861:'錯誤,正如我所解釋的,我理解它背後的原因。 「insert into mytable values('10AUGUST2016');' –