select to_date('07/09/14','yyyy-mm-dd') from dual;
正在返回14-SEP-07
由于日期和请求的格式不一样,我期待它抛出异常。其次,我们在输入日期中有斜线,并且在格式中大肆宣传。
有人可以告诉我如何确认输入值是否为所提供的格式。
答案 0 :(得分:1)
to_date
在尝试使用提供的格式掩码转换输入字符串时相对宽松。它通常不涉及字符串中的特定分隔符或掩码格式 - 如果您愿意,您的字符串可以使用短划线或斜线,或者,哎呀,星号。当然,这可能意味着您会得到意想不到的结果。在这种情况下,例如,创建的date
是在第7年(即2007年前)。这是Oracle中的有效日期,但除非您存储有关古罗马的数据,否则它很可能不是您期望的日期。
“确认输入值是否为所提供的格式”对您来说意味着什么?根据您要查找的内容,您可能希望使用正则表达式。
答案 1 :(得分: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.
答案 2 :(得分:0)
TO_DATE()
只接受一个字符串,并根据您提供的给定格式将其转换为日期/时间。如果它找不到确切的格式,它将尽力确定它是什么。根据您的'yyyy-mm-dd'
格式,Oracle推断07
是年份,14
是当天。
如果根据您的功能要求,您必须编写自己的函数来抛出预期的异常等来处理问题。
因此,当您选择生成的日期时,显示的格式实际上取决于您的NLS_DATE_FORMAT系统参数,该参数会显示您的结果日期。