有效的日期格式检查Oracle - 奇怪的行为

时间:2013-08-22 09:49:44

标签: sql oracle plsql

我们一直在研究一些遗留代码,并找到了检查日期(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'时,它不会抛出任何异常。 这可能是什么原因?

感谢您的想法。

1 个答案:

答案 0 :(得分:5)

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');