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

时间:2010-01-04 19:58:00

标签: oracle datetime timestamp

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

我用它来返回日期;

SELECT CURRENT_DATE FROM dual;

感谢名单

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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 date数据类型包括时间部分。

答案 2 :(得分:1)

尝试:

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

如果您需要某种格式。更多选择:

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

答案 3 :(得分:0)

最简单的,我想:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;