database - PL/SQL 脚本验证

标签 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;

最佳答案

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

但是你不应该在第一行的末尾有分号,它应该有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 调整为 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

关于database - PL/SQL 脚本验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479014/

相关文章:

javascript - 在 MongoDb 中使用 mapReduce 获取文档(行)计数

java - 在 Android 中使用 Java 插入 FOR 循环内的 SQLITE TABLE 得到 NPE 错误?

c# - 带 Out 参数的 Oracle 存储过程

java.sql.SQLException : ORA-00904

java - 正则表达式 - 查找文件中的所有字符串函数参数

oracle - 在此PL/SQL语句中我在做什么错?

ruby-on-rails - Rails,全局城市、国家、州的解决方案,没有数据库

javascript - 如何获取JSX输入字段的值到Javascript日期对象,然后将其插入mysql YYYY-MM-DD格式?

mysql - Hive 查询按年份和 ID 获取日期列组的最小值和最大值

oracle - PL/SQL报告文件自动运行并导出结果?