2010-01-04 102 views

回答

2

作爲一個實際的功能,你可以這樣做:

create or replace function getSysdate 
return date is 

    l_sysdate date; 

begin 

    select sysdate 
    into l_sysdate 
    from dual; 

    return l_sysdate; 

end; 
/

,你可以在sqlplus測試爲:

TEST>select getSysdate() from dual; 

GETSYSDATE 
---------- 
2010-01-04 

不知道爲什麼你會想這而不是在代碼中只有sysdate。 Oracle日期數據類型包含時間部分。

+1

Eek。那麼只是「返回sysdate」? – 2010-01-05 23:31:58

+0

是的。我試圖保持他所做的主題。我只會使用sysdate而不是任何類型的函數。 – 2010-01-06 01:08:33

12

CURRENT_DATE返回會話的日期和時間。 SYSDATE返回數據庫的日期和時間。這些值可能不同,因爲我們可以使用ALTER SESSION來更改會話的時區。您可能應該使用SYSDATE,因爲它會返回一致的值,但不知道您的業務環境很難確定。

從你的問題我懷疑你沒有意識到Oracle日期僞列包含一個時間元素。試試這個:

alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss' 
/
select current_date from dual 
/
select sysdate from dual 
/

在你自己的用戶定義的函數中,這些僞列之一沒有太多的意義。有一次,我認真考慮這是爲了讓自動化單元測試更容易。但是我從未相信自己這個設施會證明不使用標準方法。

編輯

在接受答案的作品的解決方案,但有很多不必要的包袱。所有額外的PL/SQL運行比直接select sysdate from dual;慢2-3倍。確實如此,這些數據的絕對差別非常小 - 毫秒。但在繁忙的系統中,需要撥打getSysdate()的大量電話,所有這些毫秒可能會佔用大量時間。更好的解決方案是用普通的return sysdate替換所有的代碼;這比直接調用sysdate稍慢,但稍微慢一點。

擴展dpbradley的評論,我敲了一個函數,允許我們從數據庫中替換不同的時鐘時間,用於測試。我將默認情況下的備用日期時間存儲在CLIENT_INFO命名空間中;如果我在生產系統中實現這個功能,我會爲它建立一個專用的用戶定義上下文。

所以這裏是我對getSysdate()功能的看法...

SQL> create or replace function myGetSysdate 
    2  (p_alt_date in varchar2 := null) 
    3 return date is 
    4 begin 
    5  if p_alt_date is null then 
    6   return sysdate; 
    7  else 
    8   return to_date(sys_context('userenv', p_alt_date) 
    9          , 'dd-mon-yyyy hh24:mi:ss'); 
10  end if; 
11 end; 
12/

Function created. 

SQL> 

下面是我們如何設置備用日期時間...

SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12') 

PL/SQL procedure successfully completed. 

如果沒有參數傳遞返回sysdate(默認和首選選項)。

SQL> select getsysdate from dual 
    2/

GETSYSDATE 
----------------- 
05-JAN-2010 16:25 

SQL> 

如果我們通過語境命名當我們調用我們得到的備用日期時間函數....

SQL> select mygetsysdate('CLIENT_INFO') from dual 
    2/

MYGETSYSDATE('CLI 
----------------- 
01-DEC-2010 12:12 

SQL> 
+0

如果您認爲您的數據庫/應用程序將涉及真正的應用測試播放,那麼使用SYSDATE的包裝進行設計將有助於那些無論什麼原因都無法更改主機時鐘的環境。 – dpbradley 2010-01-05 13:29:16

0

最簡單的,我想:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; 
相關問題