我是 oracle 的新手,我必须创建一个返回当前日期和时间的函数。
我用它来返回日期;
SELECT CURRENT_DATE FROM dual;
谢谢
最佳答案
CURRENT_DATE
返回 session 的日期和时间。 SYSDATE
返回数据库的日期和时间。这些值可能不同,因为我们可以使用 ALTER SESSION
更改 session 的时区。您可能应该使用 SYSDATE
,因为它会返回一致的值,尽管在不知道您的业务上下文的情况下很难确定。
根据您的问题,我怀疑您没有意识到 Oracle 日期伪列包含时间元素。试试这个:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
将其中一个伪列包装在您自己的用户定义函数中没有太多意义。有一次我认真考虑过它是为了更容易将时间注入(inject)到一些自动化单元测试中。但我从来没有说服自己,这个设施可以证明不使用标准方法是合理的。
编辑
已接受答案中的解决方案有效,但有很多不必要的包袱。所有这些额外的 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>
关于oracle - 在oracle中创建一个返回当前日期和时间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001799/