如何使用当前年份将“ MMDD”格式的字符串转换为日期

时间:2019-10-23 09:48:58

标签: oracle plsql

我有执行PROCEDURE(monthday varchar2)的程序。它会收到一个varchar2,它表示始终并以 MMDD 格式连接的月份和日期。然后,我想创建一个DATE类型的变量,该变量使用本月和日,年份为当前年份。
像:
desired_date DATE;
desired_date = ?

我正在使用Oracle SQL Developer。

2 个答案:

答案 0 :(得分:4)

EXTRACTSYSDATE开始的年份,然后将字符串连接与您的输入结合使用,并使用TO_DATE转换为日期:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  desired_date := TO_DATE( EXTRACT( YEAR FROM SYSDATE ) || monthday, 'YYYYMMDD' );
END;
/

然后:

DECLARE
  dt DATE;
BEGIN
  test( '0101', dt );
  DBMS_OUTPUT.PUT_LINE( '0101: ' || dt );

  test( '1231', dt );
  DBMS_OUTPUT.PUT_LINE( '1231: ' || dt );

  BEGIN
    test( '9876', dt );
    DBMS_OUTPUT.PUT_LINE( '9876: ' || dt );
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE( '9876: ' || SQLERRM );
  END;
END;
/

输出:

0101: 2019-01-01 00:00:00
1231: 2019-12-31 00:00:00
9876: ORA-01843: not a valid month

db <>提琴here

如果您想返回NULL以获取无效输入,则:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  desired_date := TO_DATE( EXTRACT( YEAR FROM SYSDATE ) || monthday, 'YYYYMMDD' );
EXCEPTION
  WHEN OTHERS THEN
    -- In general don't catch OTHERS but in this case the only exceptions
    -- are going to be from TO_DATE
    desired_date := NULL;
END;
/

db <>提琴here


更新

您可以通过在TO_DATE中不指定年份值来简化代码(如AleksejWilliam Robertson的建议),并使用看起来是当前年份的默认值;但是,此行为显然没有记录在任何Oracle文档页面中,因此我还将在函数中包含内联文档,以便将来审查您的函数的开发人员知道您正在故意使用此行为:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  -- Assumes that TO_DATE will, when not specified, default the year to the
  -- current year and the time to midnight.
  desired_date := TO_DATE( monthday, 'MMDD' );
END;
/

答案 1 :(得分:2)

这可能是一种方式

desired_date := to_date(monthday, 'MMDD');

根据AskTom中的旧帖子,to_date应该使用当前年份(如果未给出):

default year   = current year
default month  = current month
default day    = 1
default hour   = 0
default minute = 0
default second = 0


ops$tkyte%ORA10GR2> select sysdate, to_date( ' ', ' ' ) from dual;

SYSDATE              TO_DATE('','')
-------------------- --------------------
17-aug-2012 13:41:06 01-aug-2012 00:00:00

仍然无法在Oracle文档中找到此信息