Oracle Reports将数据库时间戳与当前时间戳进行比较

时间:2012-08-29 22:29:02

标签: 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 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。我没有正确实现我的秒/分钟代码吗?奇怪的是,我尝试了两次返回(FALSE)并且仍然继续传递报告! Oracle Reports非常不一致,令人愤怒。非常感谢任何回复。

1 个答案:

答案 0 :(得分:0)

如果wos_report_param.sys_dateTIMESTAMP(请注意,如果sys_date函数返回sysdate,则命名列DATE会相当混乱,并假设wos_report_param.sys_date是过去的时间戳,您的逻辑可以简化很多

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

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