【发布时间】:2011-01-01 09:19:43
【问题描述】:
我是 oracle 新手,我必须创建一个返回当前日期和时间的函数。
我正在使用它来返回日期;
SELECT CURRENT_DATE FROM dual;
感谢
【问题讨论】:
-
似乎有什么问题?
我是 oracle 新手,我必须创建一个返回当前日期和时间的函数。
我正在使用它来返回日期;
SELECT CURRENT_DATE FROM dual;
感谢
【问题讨论】:
我想最简单的:
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;
【讨论】:
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>
【讨论】:
作为一个实际的功能,你可以做:
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 日期数据类型包括时间部分。
【讨论】:
尝试:
SELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual;
如果您需要某种格式。更多选项在这里:
【讨论】: