APEX_UTIL.GET_SINCE关闭6分钟

Dom*_*nik 5 database oracle plsql oracle-apex

带有当前时间的APEX_UTIL.GET_SINCE怎么会告诉我时间戳记是将来的6分钟?在它按预期方式工作并返回“现在”之前,但不久之后,它表示当前日期是将来的日期。

基础Linux系统的系统时间具有正确的时间(最多一毫秒),并且该语句返回的sysdate也是正确的当前时间,因此我希望Oracle函数使用其他地方的错误引用吗?

在此处输入图片说明

Lit*_*oot 4

据我所知,事实并非如此

告诉时间戳是未来 6 分钟

在过去。


看起来好像第一个调用设置了一个“标记”,后续调用返回自那以后已经过去了多少时间。

第一次调用是在 19:39:11,并且是“现在”:

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:11 Now
Run Code Online (Sandbox Code Playgroud)

我现在只需按键盘上的 UP 键并按 ENTER:

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:12 1 seconds from now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:13 2 seconds from now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:14 3 seconds from now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:15 4 seconds from now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:39:16 5 seconds from now

SQL>
Run Code Online (Sandbox Code Playgroud)

输入上述消息(我的意思是回答问题)后,我再次调用它;它说距离标记已经过去了 3 分钟:

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:41:41 3 minutes from now

SQL>
Run Code Online (Sandbox Code Playgroud)

为了重置它,我退出 SQL*Plus 并重新开始:

SQL> exit
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

c:\Temp>sqlplus scott/tiger

SQL*Plus: Release 11.2.0.2.0 Production on Pet Lis 18 19:42:31 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> col result format a50
Run Code Online (Sandbox Code Playgroud)

新标记设置为 19:42:36:

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:42:36 Now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:42:38 2 seconds from now

SQL> select to_char(sysdate, 'hh24:mi:ss') sysd, apex_util.get_since(sysdate) result from dual;

SYSD     RESULT
-------- --------------------------------------------------
19:42:39 3 seconds from now

SQL>
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。缓存的存在是为了保持一致性,例如在渲染包含许多行且在 SYSDATE 上使用 #SINCE# 的报表时。如果没有缓存,某些结果可能会不一致。在 APEX 的上下文中,这工作得很好,因为连接仅在包状态重置之前短暂地从池中检出。对于 SQL Developer,不会发生重置,因为它使用专用连接。 (3认同)