【问题标题】:Create a function to return current date and time in oracle创建一个函数以在 oracle 中返回当前日期和时间
【发布时间】:2011-01-01 09:19:43
【问题描述】:

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

我正在使用它来返回日期;

SELECT CURRENT_DATE FROM dual;

感谢

【问题讨论】:

  • 似乎有什么问题?

标签: oracle datetime timestamp


【解决方案1】:

我想最简单的:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

【讨论】:

    【解决方案2】:

    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>
    

    【讨论】:

    • 如果您认为您的数据库/应用程序将永远参与真正的应用程序测试回放,那么使用围绕 SYSDATE 的包装器进行设计将有助于在那些您因任何原因无法更改主机时钟的环境中。
    【解决方案3】:

    作为一个实际的功能,你可以做:

    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 日期数据类型包括时间部分。

    【讨论】:

    • 呃。 “返回 sysdate”怎么样?
    • 是的。我试图跟上他正在做的事情的主题。我只会使用 sysdate 而不是任何类型的函数。
    【解决方案4】:

    尝试:

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

    如果您需要某种格式。更多选项在这里:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多