Xquery 找出离今天最近的日期
我已定义$today=当前系统日期 目标:找出从今天开始最近的“日期”元素的值,并基于下面的xml获得相应的“每股价格”值。仅供参考,在计算“最近日期”时,日期是过去还是未来并不重要 我该怎么做 我在想Xquery 找出离今天最近的日期,xquery,Xquery,我已定义$today=当前系统日期 目标:找出从今天开始最近的“日期”元素的值,并基于下面的xml获得相应的“每股价格”值。仅供参考,在计算“最近日期”时,日期是过去还是未来并不重要 我该怎么做 我在想 计算今天和每个“日期”值之间的差值 然后为每个“细节”节点添加“差异”作为“细节”的子级 然后按最小的“持续时间”排序 然后提取第一次出现的“每股价格”值 但不知何故,增加一个孩子似乎对我也不起作用 <test_record> <details> <date
<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>
2013-01-16
美元
48
20
2018-05-28
美元
49
30
2018-10-25
美元
50
40
2018-05-02
美元
51
60
不能使用“映射”,因为我只能使用xquery 1.0。您描述的步骤听起来不错,除了第二个步骤。不需要附加任何内容,因为您实际上不想修改节点。事实上,单靠XQuery是无法做到这一点的(XQuery Update是另一个用于此目的的规范)。此外,这里不需要使用地图。您的逻辑听起来像是熟悉过程编程,但函数式编程语言(XQuery就是其中之一)的概念是完全不同的,因此您可能需要熟悉它 关于您的问题:您首先计算日期和今天日期之间的差异。正如你所说的,不管这是过去还是未来,我们都必须计算持续时间的绝对值。为此,我们首先除以秒,从而得到此持续时间的秒数。由于我们现在有了一个数字,我们可以在
$abs diff
中获得绝对值。然后,我们根据该值进行订购,获得序列的第一个元素并返回price\u per\u 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
谢谢当我在上面尝试时,它给出了以下错误:XQuery静态错误在#…yTimeDuration('PT1S'))顺序中#:未知构造函数:{}dayTimeDuration@user8748135,您使用的是哪个XQuery实现?
xs:dayTimeDuration
数据类型及其构造函数应该是任何完整的XQuery 1.0实现的一部分:我使用的是使用saxon8.jar(应该支持XQuery 1.0)的XQuisitor(处理XQuery的独立工具)和xquisitor-1.0a5.jar。@user8748135是否有任何原因让您使用这个看起来非常过时的工具,它似乎自2005年以来就不受支持了。我与XQuery合作了很长一段时间(这是一个小社区),这是我第一次听到这个消息。撒克逊人8号也相当古老。与使用BaseX或exist db相比,我真的看不出使用它有什么好处。