我是oracle的新手,我必须创建一个返回当前日期和时间的函数。
我用它来返回日期;
SELECT CURRENT_DATE FROM dual;
感谢名单
答案 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;
如果您需要某种格式。更多选择:
答案 3 :(得分:0)
最简单的,我想:
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;