Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle报告比较数据库时间戳和当前时间戳_Oracle_Timestamp_Oraclereports - Fatal编程技术网

Oracle报告比较数据库时间戳和当前时间戳

Oracle报告比较数据库时间戳和当前时间戳,oracle,timestamp,oraclereports,Oracle,Timestamp,Oraclereports,我正在尝试编写BeforeReport触发器,检查用户是否在创建后120秒内访问报表数据 我的代码如下: function BeforeReport return boolean is ENTRYDATE TIMESTAMP; SERVERDATE TIMESTAMP; DIFFSECONDS NUMBER; begin /*Checks to see if user is accessing the data within 120 seconds of creation in databa

我正在尝试编写BeforeReport触发器,检查用户是否在创建后120秒内访问报表数据

我的代码如下:

function BeforeReport return boolean is

ENTRYDATE TIMESTAMP;
SERVERDATE TIMESTAMP;
DIFFSECONDS NUMBER;
begin

/*Checks to see if user is accessing the data within 120 seconds of creation in database*/
VALIDTIMELENGTH := 120;
SELECT SYS_DATE INTO ENTRYDATE FROM WOS_REPORT_PARAM WHERE SEQUENCE_NUM=UPPER(:SEQUENCENUM) AND PARAMETER='year';
SERVERDATE := CURRENT_TIMESTAMP;
DIFFSECONDS := ((EXTRACT(YEAR FROM ENTRYDATE)- EXTRACT(YEAR FROM SERVERDATE))*31536000) +
             ((EXTRACT(MONTH FROM ENTRYDATE)- EXTRACT(MONTH FROM SERVERDATE))*2592000) +
             ((EXTRACT(DAY FROM ENTRYDATE) - EXTRACT(DAY FROM SERVERDATE))*86400) +
             ((EXTRACT(HOUR FROM ENTRYDATE) - EXTRACT(HOUR FROM SERVERDATE))*3600) +
             ((EXTRACT(MINUTE FROM ENTRYDATE) - EXTRACT(MINUTE FROM SERVERDATE))*60) +
             (EXTRACT(SECOND FROM ENTRYDATE) - EXTRACT(SECOND FROM SERVERDATE));
  IF DIFFSECONDS > VALIDTIMELENGTH THEN RETURN(FALSE);
  ELSE
  return (TRUE);
  END IF;
  END;

问题是,无论经过多少时间,我的代码似乎都返回true。我是否没有正确实现秒/分钟代码?奇怪的是,我尝试了两次返回(假),结果还是通过了报告!甲骨文的报告前后矛盾,令人愤怒。如果
wos\u report\u param.sys\u date
是一个
时间戳(注意,如果有一个
sysdate
函数返回一个
date
,那么命名一个列
sys\u date
是相当混乱的),并且假设
wos\u report\u param.sys\u date
过去是一个时间戳,你的逻辑可以简化很多

IF( current_timestamp - entrydate > numtodsinterval( validTimeLength, 'second' ) )
THEN
  RETURN true;
ELSE 
  RETURN false;
END IF;

如果我的猜测是正确的,并且
wos\u report\u param.sys\u date
是过去的时间戳,那么您正在计算的
diffseconds
将是一个负数,这解释了为什么您的过程总是返回
false
。您需要从较晚的日期中减去较早的日期,以便产生一个正间隔而不是负间隔。或者,您可以在
diffseconds
计算周围抛出一个
abs

将我的代码更改为实现您的(更干净的)解决方案后,我的报告似乎仍然继续显示报告,而它应该返回false。问题不是它总是返回false,而是它似乎总是返回TRUE。但是你是对的,我的日期的减法是按相反的顺序进行的。@KevinCruz-当函数返回
true
时,当你认为它应该返回
false
或当你认为它应该返回
true
时,这两个时间戳是什么
current_timestamp
返回一个带有时区的
时间戳
,因此如果
entrydate
具有不同的隐含时区,则可能会影响计算。进一步实验后,似乎只要我添加这一行:
从wos_report_param中选择sys_date到entrydate,其中sequence_num=:SEQUENCENUM和parameter='year'报告停止听我说。即使我将返回值更改为硬编码的false,它仍会继续执行
entrydate的日期格式是:8/14/2012 4:22:49.687108 PM
,而当前的时间戳是:8/29/2012 5:08:28.351726 PM-07:00
也许这就是问题的根源?什么是匹配entrydate时间戳格式的简单方法?@KevinCruz-匹配时间戳格式是什么意思?如果
wos\u report\u param.sys\u date
时间戳
,则没有可匹配的格式。如果两个时间戳相隔2周,则问题不在于时区转换。听起来您的
SELECT INTO
语句引发了一个异常。这会让我相信您的查询并没有返回恰好1行。对于select into语句,当我通过Toad运行该语句时,只返回一行。很明显,是select into语句破坏了报告,但我一辈子也弄不明白为什么。我真正想做的是从表中检索时间戳,将检索到的时间戳与
8/14/2012 4:22:49.687108 PM
格式的
当前时间戳进行比较,并检查它是否在
120秒的有效
时间长度范围内。为什么当我不在我的
系统日期