2016-08-24 40 views
0

我有一个动态操作,我想在触发之前在JavaScript条件中执行一些检查。我希望它只显示一个区域,如果从数据库返回到只读字段(P4_NEXT_RENEWAL_DATE)的日期比今天的系统日期晚。Oracle Apex 5中的动态操作无法将日期与Oracle进行比较

我的Oracle表具有日期字段,返回到一个只读页面项目:

P4_NEXT_RENEWAL_DATE

这将返回一个值,如:

下一个续约日期

16-JUL-2017 

我有一个动态的动作,看起来如下:

(
(apex.item('P4_RENEWAL_REQUIRED').getValue()=='Yes' && apex.item('P4_RENEWAL_REQUIRED_AGREE').getValue()=='Agree') 
|| 
(apex.item('P4_RENEWAL_REQUIRED').getValue()=='No' && apex.item('P4_RENEWAL_REQUIRED_AGREE').getValue()=='Disagree') 
) 
&& 
Date.parse(apex.item('P4_NEXT_RENEWAL_DATE').getValue()) > new Date() 

它是不工作这最后一点,

&& Date.parse(apex.item('P4_NEXT_RENEWAL_DATE').getValue()) > new Date() 

,我希望如果我的未来只会显示该区域续约日期晚于今天的日期....但它显示该地区,无论日期是过去还是未来。

我不确定我的只读字段是否返回P4_NEXT_RENEWAL_DATE中日期的字符串版本,或者Apex是否知道它来自Oracle的日期值,所以javascript会将其视为日期值...我有尝试了几个date.parse()方法,但似乎没有任何工作。

我也尝试不使用date.parse,并且使用我将不得不通过返回的原始Date对象的直apex.item.getValue()调用,但没有运气之一:

&& apex.item('P4_NEXT_RENEWAL_DATE').getValue() > new Date() 

任何意见赞赏。

+0

我没有在'Date.parse'上找到线索,但我可以告诉你P4_NEXT_RENEWAL_DATE中的值是一个**字符串**例如'16 -JUL-2017' 。所以问题是:Date.parse'可以处理那种格式的字符串吗? –

+0

Oracle为什么会从日期列中获取日期值,然后将其保存在一个页面项中,该页是一个字符串类型的绑定(?)变量?我尝试使用3个Oracle子串将日期分成3部分......然后从部分“2017年7月16日”中构建一个字符串等,但仍然没有欢乐 – smackenzie

+0

Google'Date.parse'和'DD-MMM-YYYY '为解决方案提供建议。 'apex.item'是一个Javascript函数(由Oracle提供),它看到的只是一个“文本”类型的输入,它不查看数据库中的列,因此它不知道它拥有日期值。 –

回答

0

首先,我遇到了这个MDN documentation for Date.parse

不推荐使用Date.parse,直到ES5,字符串的解析完全依赖于实现。不同的主机如何解析日期字符串仍然存在很多差异,因此应该手动解析日期字符串(如果要适应多种不同的格式,库可以提供帮助)。

表示RFC2822或ISO 8601日期的字符串(可能会使用其他格式,但结果可能是意外的)。

和这个来自documentation for the Date object

注意:由于浏览器的差异和不一致性,强烈建议不要使用Date构造函数(和Date.parse,它们是等价的)解析日期字符串。

我在不同的浏览器测试了一点,镀铬手柄愉快地在Date.parse“DD-MON-YYYY”和日期构造器的格式值,但Firefox和IE浏览器没有。

如果你想在JavaScript中操纵/比较日期,那么我可以推荐使用Moment.js日期实用程序库来解决这些问题。无论是或者找出一种方法来比较你在PL/SQL中的日期。