在oracle中创建函数返回当前日期和时间

问题描述:

我是oracle新手,我必须创建一个返回当前日期和时间的函数。在oracle中创建函数返回当前日期和时间

我正在使用它返回日期;

SELECT CURRENT_DATE FROM dual; 

感谢名单

+2

有什么事是问题吗? – 2010-01-04 20:01:51

作为一个实际的功能,你可以这样做:

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

尝试:

SELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual; 

,如果你需要它在一定的格式。更多选择在这里:

http://www.psoug.org/reference/date_func.html

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

最简单的,我想:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;