我是一个流口水的新手,了解和工作大约10天的流口水。 我遇到了一个问题,即要在规则的LHS部分中比较Date()对象。
// in Java
SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss");
session.setGlobal("currentDate", format.format(new Date()));
# in drl file
global java.lang.String currentDate ;
#global java.util.Date currentDate; both tested
when
$united : LotteryUnitedDO(lotteryTypeId == LotteryTypeEnum.SSQ,
totalFee >= 1000,
shareCnt >= (0.1 * totalShare),
#unitedEndTime is a java.util.Date Object
unitedEndTime > currentDate
)
currentDate的值是当前日期,我看过一些例子和文章这样做,但他们只使用日期的“yyyy-mm-dd”部分。但我必须比较“hh:mm:ss”部分。像这样:
$dateInputBox : DateInputBox(verifyDate > "12-Oct-2005")
我尝试更改“drools.dateformat”属性并将插入知识库的日期格式化以获取各种编译错误。所以如何处理这个或者drools只是无法处理小时部分在LHS中约会?
在此先感谢您的所有建议。
答案 0 :(得分:9)
要比较日期,您可以简单地使用Drools Fusion的时间运算符(之后,之前等):
when
MyClass( myDate after $someOtherDate )
then
...
但是,您的方法还有另一个问题:您不应该在某种情况下对全局进行推理。请参阅全局变量专家手册section。
“现在”的概念在Drools中有点问题。实际上,也许“有问题”不是正确的词;让我们选择“棘手”。你如何表示它在很大程度上取决于你的用例。我会试着总结一下:
Now
,其中包含一个Date
字段。初始化并将其与您的其他事实一起插入,然后反对它而不是全局。Now
事实越来越过时了。我们解决这个问题的方法是使用WorkingMemoryEventListener
。我们使用此侦听器的objectInserted
,objectRetracted
和objectUpdated
方法来保持我们的Now
事实最新(我们不关心精度不到一分钟,因此我们检查是否从上次更新过去一分钟,以避免不必要的开销)。规则不会评估工作内存是否未更改,因此使用此侦听器足以确保在需要时更新Now
(除非您的查询依赖于{{1}的当前值},但那是另一个话题。)