我有一个日期栏。现在我的任务是创建一个自定义项。此自定义项的基本目的是检查日期的年份。这是甲骨文。
如果年份小于1753,则将年份指定为1753并返回日期。
前任:

1) select xyz_fun('1800-01-01') from a_table => Return 1800 - 01 -01
2) select xyz_fun('1600-01-01') from a_table => Return 1753 - 01 -01
3) select xyz_fun('0001-01-01') from a_table => Return 1753 - 01 -01

返回值应为日期。
我已经编写了一个udf,但是它返回警告,尽管没有显示警告。
create or replace function someschema.change_date(date1 in date) return date
;

begin
  if( extract(year from date1) < 1753 )
    then
      return to_date('1753'||'-'|| to_char(date1,'MM')||'-'|| to_char(date1,'dd'),'yyyy-MM-dd');
    else
    return date1;
    end if;

end;

最佳答案

您可以在SQL*Plus中发出“显示错误”来查看错误。
但第一行末尾不应该有分号,它应该有asis

create or replace function someschema.change_date(date1 in date) return date as
begin
  if( extract(year from date1) < 1753 )
    then
      return to_date('1753'||'-'|| to_char(date1,'MM')||'-'|| to_char(date1,'dd'),'yyyy-MM-dd');
    else
      return date1;
    end if;
end;
/

你所做的与你所说的不太相符;你把日期和原来的日期分开,这看起来很奇怪。如果确实需要1753-01-01,则可以使用ANSI日期文字:
     return date '1753-01-01';

要处理闰年(根据评论),您可以使用add_months和年份差异来做类似的事情,假设您很高兴02-29被调整为02-28(也可以根据david的回答简化一点):
create or replace function change_date(date1 in date) return date as
begin
    return greatest(date1,
        add_months(date1, 12 * (1753 - extract(year from date1))));
end;
/

alter session set nls_date_format = 'YYYY-MM-DD';
select change_date(date '1600-02-29') from dual;

CHANGE_DAT
----------
1753-02-28

09-03 22:52