混淆使用to_date函数来确认日期格式

时间:2014-07-14 15:10:25

标签: oracle

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

正在返回14-SEP-07

由于日期和请求的格式不一样,我期待它抛出异常。其次,我们在输入日期中有斜线,并且在格式中大肆宣传。

有人可以告诉我如何确认输入值是否为所提供的格式。

3 个答案:

答案 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系统参数,该参数会显示您的结果日期。