我已定义$ today =当前系统日期。
目标:从今天找出最接近的“date”元素的值,并根据下面的xml获得相应的“price_per_share”值。仅供参考,计算“最近日期”时,日期是过去还是将来无关紧要。
我该怎么做?
我在考虑
但不知何故,添加一个孩子似乎也不适合我。
<test_record>
<details>
<date>2013-01-16</date>
<currency>USD</currency>
<shares>48</shares>
<price_per_share>20</price_per_share>
</details>
<details>
<date>2018-05-28</date>
<currency>USD</currency>
<shares>49</shares>
<price_per_share>30</price_per_share>
</details>
<details>
<date>2018-10-25</date>
<currency>USD</currency>
<shares>50</shares>
<price_per_share>40</price_per_share>
</details>
<details>
<date>2018-05-02</date>
<currency>USD</currency>
<shares>51</shares>
<price_per_share>60</price_per_share>
</details>
不能使用“map”,因为我被限制使用xquery 1.0。
答案 0 :(得分:1)
您描述的步骤听起来不错,但第二步除外。没有必要附加任何内容,因为您实际上并不想修改节点。事实上,你不能单独使用XQuery(XQuery Update是另一个用于此目的的规范)。此外,这里不需要使用地图。你的逻辑听起来像是了解程序编程,但函数式编程语言(XQuery是一个)的概念却完全不同,所以你可能想要熟悉它。
关于您的问题:您首先计算日期和今天日期之间的差异。正如你所说,无论是过去还是将来都无关紧要,所以我们必须计算持续时间的绝对值。为此,我们首先除以秒,从而获得此持续时间的秒数。正如我们现在有一个数字,我们可以得到$abs-diff
中的绝对值。然后我们按此值排序,获取序列的第一个元素并返回price_per_share
let $today := fn:current-date()
return (
for $detail in //details
let $diff := xs:date($detail/date) - $today
let $abs-diff := abs($diff div xs:dayTimeDuration('PT1S'))
order by $abs-diff
return $detail
)[1]/price_per_share