PL / SQL脚本验证

时间:2013-05-10 09:23:52

标签: database oracle plsql

我有一个日期列。现在我的任务是创建一个udf。此UDF的基本目的是检查日期的年份。这是在ORACLE。

如果年份少于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;

2 个答案:

答案 0 :(得分:3)

您可以在SQL * Plus中发出“show errors”以查看错误。

但是你不应该在第一行的末尾加上分号,它应该有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调整为{{1 (并根据David的回答简化了一点):

02-28

答案 1 :(得分:3)

这是将数据传递到早期版本的SQL Server的问题,它不会存储1753年之前的日期吗?或者一个公历问题(Oracle处理好了)?

无论如何,您可能希望在纯SQL以及PL / SQL方法中尝试此操作:

to_date(to_char(greatest(1753,to_number(to_char(my_date,'yyyy'))),'fm0000')||to_char(my_date,'-MM-dd'),'yyyy-mm-dd')