我有一个日期列。现在我的任务是创建一个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;
答案 0 :(得分:3)
您可以在SQL * Plus中发出“show errors”以查看错误。
但是你不应该在第一行的末尾加上分号,它应该有as
或is
:
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')