设为首页 | 收藏本站
185 1521 8668

DMN中的日历算术

发表时间:2025-04-02 15:25作者:Together规则引擎
文章附图

通常在决策模型中,您需要计算日期或持续时间。例如,一个申请必须在某些事件发生后90天内提交,或者不应在上一剂疫苗的120天内接种。DMN具有强大的日历算术功能。这篇文章将说明如何使用它们。

一、ISO 8601 格式

日期、时间和持续时间的 FEEL 表达式可能看起来很奇怪,但不要为此责怪 DMN。 它们基于 ISO 8601 定义的格式,ISO 8601 是许多计算机语言的日期和时间的国际标准。 在 FEEL 表达式中,可以使用构造函数指定日期和时间,例如 date(),应用于 ISO 格式的文字字符串值,如下所示。 对于输入和输出数据值,构造函数被省略。

日历计算1.png

日期是4位数的年份、连字符、2 位数的月份、连字符、2 位数的日。 例如,要将 2017年5月3日表示为输入数据值,只需写入 2015-05-03。 但在FEEL表达式中,您必须编写日期(2017-05-03)。

时间采用24小时制,没有上午/下午。 格式为2位数小时、2位数分钟、2位数秒,小数点后可选小数秒。 还有一个可选的时间偏移字段,表示时区,表示为与 UTC 的偏移量,即他们过去所说的格林威治标准时间。 例如,要指定太平洋夏令时间 1:10 pm 30 秒(UTC 7 小时),您可以输入 13:10:30-07:00 作为输入数据值,或 time(13:10:30-07 :00) 在 FEEL 表达式中。 要将时间指定为UTC,您可以使用 00:00 作为时间偏移量,也可以使用字母 Z(代表 Zulu,它是UTC的军事符号)。 DateTime 值将日期和时间格式连接起来,并用大写 T 分隔它们,如您在此处看到的。 在 FEEL 表达式中,必须使用正确的构造函数并将 ISO 文本字符串括在引号中。

二、日期和时间组件

FEEL中,可以使用点后跟组件名称从日期、时间或 dateTime 中提取年、月或日组件:年、月、日、小时、分钟、秒或时间偏移。 例如,表达式 date(“2017-05-03”).year 返回数字 2017。所有这些提取都返回一个数字,但时间偏移部分除外,它返回的不是数字而是持续时间,我们很快就会讨论这种格式

三、持续时间

两个日期、时间或 dateTimes 之间的间隔定义持续时间。 DMN 与 ISO 一样,定义了两种持续时间:天和时间持续时间,以及年和月持续时间。 天数和持续时间等于持续时间中的秒数。 ISO 格式为 PdDThHmMsS,其中小写的 d、h、m 和 s 是整数,表示持续时间中的天、小时、分钟和秒。 如果其中任何一个为零,则将它们与相应的大写 D、H、M 或 S 一起省略。并且应该对它们进行归一化,以使分量值的总和最小化。

例如,61秒的持续时间可以写为P0DT61S,但我们可以省略0D,标准化形式为1分1秒,因此正确的值为PT1M1S。 在 FEEL 表达式中,您需要将其括在引号中,并将其作为持续时间构造函数的参数:duration(“PT1M1S”)。

天和时间持续时间是日历算术中通常使用的持续时间,但对于较长的持续时间,可以使用替代的年和月持续时间,相当于持续时间中包含的整月数。 ISO 格式为 PyYmM,其中小写的 y 和 m 又是表示持续时间中的年数和月数的数字,并且标准化形式再次最小化这些分量值的总和。 因此,14 个月的持续时间将以标准化形式写为 P1Y2M,在 FEEL 中写为持续时间(P1Y2M)。 由于月份包含不同的天数,因此年和月持续时间的精确值是开始日期和结束日期之间的月数,如果结束月份的日期大于或等于开始月份的日期,开始月则加1,否则加 0。

与日期和时间一样,您可以使用点符号提取持续时间的组成部分。对于天数和持续时间,其组成部分是天、小时、分钟和秒。对于年和月的持续时间,其组成部分是年和月。

四、算术表达式

所有这一切的重点是能够进行日历算术。

让我们从添加持续时间开始。

l 您可以向日期时间或日期添加天数和持续时间,并返回日期时间。

l 您可以向日期添加年和月持续时间,以提供日期,或向日期时间添加持续时间,提供另一个日期 日期时间。

l 您可以向某个时间添加天数和持续时间,从而提供另一个时间。

l 您可以添加相同类型的两个持续时间日期和时间或年和月以获得另一个期间的类型。

l 日历算术的一个常见用途是查找两个日期或日期时间之间的差异。

l 从结束日期或日期中减去开始日期或日期时间始终返回日期和时间持续时间,即使跨越多年期。

l 若要获取开始日期和结束日期之间的年和月持续时间值,请使用 FEEL。 函数年和月持续时间(开始日期时间,结束日期时间)。

您可以将持续时间乘以数字以获得相同类型的另一个持续时间,可以是天和持续时间,也可以是年和月持续时间。

您可以将持续时间除以数字以获得相同类型的另一个持续时间。但真正有用的方法是将持续时间除以持续时间,给出一个数字。例如,要查找一年中的秒数,表达式持续时间(“P365D”)/持续时间(“PT1S”)返回正确的值,数字 31536000。请注意,这不是通过提取秒分量返回的结果。表达式持续时间 (P365D).秒返回 0。

示例:

退款资格

下面是来自 DMN 训练的日历算术的简单示例。给定商品退货的购买日期和时间戳,根据简单的规则确定退款资格。

顾客有权在购买后的短期内获得全额或部分退款。

输入数据:

l 返回时间戳(DateTime)

l 购买日期(日期)

规则:

l “全额退款”如自购买日期起计<14天内退还

l “部分退款”(如自购买日期起14至28天内退还)

l “无退款”(如自购买日期起计>28天)

使用这些值运行它:

返回时间戳2017-05-01T13:50:00

购买日期2017-04-05

使用日历算术的解决方案如下所示:

日历计算2.png

在这里,我们使用一个上下文,其中第一个上下文条目通过减去两个 dateTimes 来计算天数和持续时间。第二个上下文条目是应用规则的决策表。请注意,我们可以像在决策表输入条目中使用任何其他 FEEL 类型一样使用持续时间。

文章分类: DMN建模
分享到:
精选文章
公众号
关于我们
联系方式
让您的业务更自动化、智能化!
联系邮箱:   zhangy@jee-soft.cn       wangyl@jee-soft.cn
185 1521 8668
183 3562 2627
联系电话: