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

标签 oracle datetime timestamp

我是 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/

相关文章:

oracle - ORACLE TIMEOUTS-如何使用此连接字符串设置更长的超时时间?

oracle - PL/SQL 包中内部过程前向声明的优点

python - Timedelta 时间差表示为 float 变量

php - 当用户发布某些内容时,如何更改 mysql 时间戳的格式

Mysql时间戳数据类型

php - 使用时间戳对数组进行排序?

oracle - 创建oracle包遇到PLS-00103 : Encountered the symbol "CREATE"

java - 如果一条记录插入失败,如何让Preparedstatement.executeBatch() 为好记录工作

ruby-on-rails - 编写事件装饰器 DRY

excel - 如何将 Excel 日期/时间转换为纪元