Oracle 使用to_date函数确认日期格式

Oracle 使用to_date函数确认日期格式,oracle,Oracle,正在返回2007年9月14日 我希望它抛出一个异常,因为请求的日期和格式不一样。其次,我们在输入日期上有斜杠,在格式上有炒作 有人能告诉我如何确认输入值是否为所提供的格式。REGEXP\u LIKE可以这样做。注意,这是基本的,因为它可以接受像2014-0-32这样的值。但是,无论您接下来在代码中做什么,这些疯狂的值都会失败,例如to_date() 编辑:如果你喜欢PL/SQL,你可以做一个正则表达式匹配并抛出你自己的异常 SELECT 'Yes, valid boss.' is_valid

正在返回2007年9月14日

我希望它抛出一个异常,因为请求的日期和格式不一样。其次,我们在输入日期上有斜杠,在格式上有炒作


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

REGEXP\u LIKE
可以这样做。注意,这是基本的,因为它可以接受像
2014-0-32
这样的值。但是,无论您接下来在代码中做什么,这些疯狂的值都会失败,例如
to_date()

编辑:如果你喜欢PL/SQL,你可以做一个正则表达式匹配并抛出你自己的异常

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.

to_date
在尝试使用提供的格式掩码转换输入字符串时相对自由。它通常与字符串或格式掩码中的特定分隔符无关——如果需要,字符串可以使用破折号或斜杠,或者星号。当然,这可能意味着你会得到意想不到的结果。例如,在这种情况下,创建的
日期是在第7年(即2007年前)。在甲骨文中这是一个有效的日期,但除非您存储的是古罗马的数据,否则它不太可能是您期望的日期

“确认输入值是否为所提供的格式”对您来说究竟意味着什么?根据您要查找的内容,您可能希望使用正则表达式。

仅获取字符串并将其转换为与您提供的给定格式相关的日期/时间。如果找不到确切的格式,它将尽最大努力确定可能的格式。根据您的
'yyyy-mm-dd'
格式,Oracle推断
07
是年份,
14
是日期

您必须编写自己的函数来抛出预期的异常或类似的异常来处理问题,如果有任何异常是基于您的功能需求的


因此,当您选择结果日期时,显示的格式实际上基于您的系统参数,该参数给出了结果日期。

我认为这只回答了您的一些问题,但请查看
TO_date()的官方文档
仅获取字符串,并根据您提供的给定格式将其转换为日期/时间。如果找不到确切的格式,它将尽最大努力确定可能的格式。根据
'yyyy-mm-dd'
格式,Oracle推断
07
是年份,
14
是日期()。您必须编写自己的函数来抛出预期的异常或类似的异常来处理此问题,如果基于您的函数需求有异常的话。您好Justin,感谢您指出分隔符和正则表达式的概念。通过“如何确认输入值是否为提供的格式”,我的意思是,如果掩码为yyyy mm dd或引发异常,我想查找日期为2007-09-14。我必须使用正则表达式来确保这一点,然后才能像joshua在下面展示的那样调用日期。非常感谢joshua。正则表达式帮助我添加了对-、/的检查,以及输入日期中的位置数,然后将其提供给该掩码的_日期。一百万泰铢。
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.
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.