我有执行PROCEDURE(monthday varchar2)
的程序。它会收到一个varchar2
,它表示始终并以 MMDD 格式连接的月份和日期。然后,我想创建一个DATE
类型的变量,该变量使用本月和日,年份为当前年份。
像:
desired_date DATE;
desired_date = ?
我正在使用Oracle SQL Developer。
答案 0 :(得分:4)
EXTRACT
从SYSDATE
开始的年份,然后将字符串连接与您的输入结合使用,并使用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
中不指定年份值来简化代码(如Aleksej和William 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文档中找到此信息