Xpath / xQuery的差异在几个月内

时间:2015-07-17 17:49:15

标签: xpath xquery

我正在尝试获取xPath的两个日期之间的差异。

我在几天(1127)中得到它没有任何问题

days-from-duration(xs:date('2012-06-17')-xs:date('2009-05-17'))  

当我尝试在几个月内完成时,我得到0

 months-from-duration(xs:date('2012-06-17')-xs:date('2009-05-17')) 

我确实注意到这只会回到日期(“P1126D”),所以可能问题就是不确定如何修复它。

 xs:date('2012-06-17')-xs:date('2009-05-17')

感谢您的帮助!

所以我似乎最好的办法是手动计算它。

(year-from-date(xs:date('2012-06-17')) - year-from-date(xs:date('2012-05-18')))*12 + month-from-date(xs:date('2012-06-17')) -month-from-date(xs:date('2012-05-18')) + (if (day-from-date(xs:date('2012-06-17'))  < day-from-date(xs:date('2012-05-18')) ) then -1 else 0)

2 个答案:

答案 0 :(得分:1)

问题是days-from-duration会返回days 字段 - 而不是持续时间包含的天数。同样数月和数年。

现在,您可以按天划分,但不能按月划分(因为月份边界不均匀):

(: arg1 here is a dayTimeDuration, which can't be easily converted to a yearMonthDuration :)
let $arg1 := xs:date('2012-06-17')-xs:date('2009-05-17')
return xs:dayTimeDuration($arg1) div xs:dayTimeDuration("P30D")

答案 1 :(得分:1)

此功能未包含在规范中,因为我们无法同意它的语义。我们听到的论点是,2015年3月31日到2015年9月30日之间的差异是6个月,而且是5个月的争论。 (建议:负差异似乎比积极差异更有问题。)您可以很容易地发现日期加上6个月减去6个月不是您开始的日期。您必须定义您认为答案应该是什么,并使用较低级别的设施(例如从月份开始和从年初开始)来实施。