2017-10-09 205 views
0

我已经定义了$ today =当前系统日期。查找距今天最近的日期

目的:找出距今天最近的“日期”元素的值,并根据下面的xml获取相应的“price_per_share”值。仅供参考,计算“最近日期”时,过去或未来日期无关紧要。

我该怎么做?

我在想

  1. 计算的今天,每个“日期”值之间的差额
  2. 然后添加“差异化”为“细节”孩子的每一个“细节”节点
  3. 然后按最小“持续时间”排序
  4. 然后提取第一个出现的“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> 

不能使用 “地图”,因为我限制使用XQuery 1.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 
+0

谢谢。当我在上面尝试时,它给了我下面的错误:#yTimeDuration('PT1S') )order#: 中的XQuery静态错误未知的构造函数:{http://www.w3.org/2001/XMLSchema} dayTimeDuration – user8748135

+1

@ user8748135,哪个XQuery实现是您正在使用的? 'xs:dayTimeDuration'数据类型及其构造函数应该是任何完整的XQuery 1.0实现的一部分:https://www.w3.org/TR/xpath-datamodel/#types-predefined,https://www.w3 .org/TR/xquery-operators /#constructor-functions-for-xsd-types –

+0

我正在使用XQuisitor(一个独立的工具来处理xquery),它使用了saxon8.jar(它应该支持XQuery 1.0)和xquisitor-1.0a5 。罐。 – user8748135

相关问题