我是一个流口水的新手,了解和工作大约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
)
Run Code Online (Sandbox Code Playgroud)
currentDate的值是当前日期,我看过一些例子和文章这样做,但他们只使用了日期的"yyyy-mm-dd"部分.但我必须比较"hh:mm:ss"部分.像这样:
$dateInputBox : DateInputBox(verifyDate > "12-Oct-2005")
Run Code Online (Sandbox Code Playgroud)
我试图更改"drools.dateformat"属性并格式化插入知识库的日期只是为了获得各种编译错误.所以如何处理这个或者drools只是无法处理LHS中日期的小时部分?
在此先感谢您的所有建议表示赞赏.
小智 9
要比较日期,您可以简单地使用Drools Fusion的时间运算符(之后,之前等):
when
MyClass( myDate after $someOtherDate )
then
...
Run Code Online (Sandbox Code Playgroud)
但是,您的方法还有另一个问题:您不应该在某种情况下对全局进行推理.请参阅全局变量专家手册部分.
"现在"的概念在Drools中有点问题.实际上,也许"有问题"不是正确的词; 让我们选择"棘手".你如何表示它在很大程度上取决于你的用例.我会试着总结一下:
Now,其中包含一个Date字段.初始化并将其与您的其他事实一起插入然后反对它而不是全局.Now事实越来越过时了.我们解决这个问题的方法是通过使用a WorkingMemoryEventListener.我们使用objectInserted,objectRetracted以及objectUpdated这个监听器的方法来保持我们Now其实现在(我们不关心精度不到一分钟,所以我们检查一分钟是否已经从上次更新传递,以避免不必要的开销).规则不会评估工作内存是否未更改,因此使用此侦听器足以确保Now在需要时更新(除非您的查询依赖于当前值Now,但这是另一个主题).