1

日付列があります。今私の仕事は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

戻り値は Date である必要があります。

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;
4

2 に答える 2

3

これは、1753 年より前の日付が格納されていない初期バージョンの SQL Server にデータを渡す際の問題ですか? または、グレゴリオ暦の問題 (どのオラクルが OK を扱っているか) ですか?

とにかく、純粋な 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')
于 2013-05-10T09:35:09.787 に答える
3

エラーを確認するには、SQL*Plus で「show errors」を発行します。

ただし、最初の行の最後にセミコロンを付けるべきではありません。 asorを付ける必要があり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満足していると仮定して、年の差を使用して次のようなことを行うことができます(また、Davidの回答に従って少し単純化します):02-2902-28

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
于 2013-05-10T09:27:04.620 に答える