【问题标题】:Valid date format check Oracle - weird behaviour有效的日期格式检查 Oracle - 奇怪的行为
【发布时间】:2013-08-22 09:49:43
【问题描述】:

我们一直在研究一些遗留代码,并找到了检查 date(VARCHAR2) 是否以正确的格式“YYYY-MM-DD HH24:MI:SS”传递的函数。它使用简单的构造

function IS_CORRECT_TIMESTAMP(P_EVENT_TIMESTAMP varchar2)
    return number is
    V_TIMESTAMP timestamp;
  begin
    select TO_TIMESTAMP(NVL(P_EVENT_TIMESTAMP, '1'),
                        'YYYY-MM-DD HH24:MI:SS')
      into V_TIMESTAMP
      from DUAL;
    return 1;
  exception
    when others then
      return - 1;
  end;

问题是,当我传递例如“22-AUG-13”的值时,它不会引发任何异常。 这可能是什么原因?

感谢您的想法。

【问题讨论】:

  • Oracle 尝试(有时过于努力)提供帮助,converts strings to dates with some flexibility。你已经被告知使用FX 修饰符来防止这种情况。仅供参考,您的模型22-AUG-13 变为0022-08-13 00:00:00,这仍然有效;如果您使用RRRR 而不是YYYY,那将是2022-08-13 00:00:00,这也是有效的。有些日期仍然会失败,例如22-AUG-99.

标签: sql oracle plsql


【解决方案1】:

FX 格式模型修饰符可用于要求字符串与格式模型之间的精确匹配:

select TO_TIMESTAMP(P_EVENT_TIMESTAMP, 'FxYYYY-MM-DD HH24:MI:SS')
  into V_TIMESTAMP
  from DUAL;

此外,您可以通过不查询DUAL 表来防止上下文切换,以便将字符串转换为timestamp 数据类型:

V_TIMESTAMP := TO_TIMESTAMP(P_EVENT_TIMESTAMP, 'FxYYYY-MM-DD HH24:MI:SS');

【讨论】:

  • 非常感谢!我不知道“Fx”指令,非常好用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2013-01-20
相关资源
最近更新 更多