2013-05-10 108 views
1

我有一個日期列。現在我的任務是創建一個udf。這個UDF的基本目的是檢查日期的一年。這是在ORACLE中。PL/SQL腳本驗證

如果年份小於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; 
+1

考慮簡化你的表情,也許是:TO_DATE( '1753' || TO_CHAR(DATE1,' - MM-dd'),'yyyy-MM-dd') – 2013-05-10 09:29:55

回答

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進行調整,以02-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 
+0

感謝問題解決.. :) – Prashanth 2013-05-10 09:44:31

+1

@Prashanth - 順便說一句,如果你保持每月和每天,你需要以某種方式處理閏年。 ''從double'選擇change_date(date'1600-02-29')會拋出'ORA-01839:date指定的月份無效',因爲'1753-02-29'不是有效的日期。 – 2013-05-10 11:16:55

+0

是啊..我只是面對它..謝謝.. :) – Prashanth 2013-05-10 14:43:38

3

這是將數據傳遞到SQL服務器,它不早期版本中的問題在1753年之前存儲日期?還是公曆問題(甲骨文處理好)?

無論如何,你可能想嘗試這種在純粹的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') 
+0

不應該是'最大'? – 2013-05-10 09:36:34

+0

哦,是的。乾杯! – 2013-05-10 09:37:29