找出今天最近的日期

时间:2017-10-09 20:12:26

标签: xquery

我已定义$ today =当前系统日期。

目标:从今天找出最接近的“date”元素的值,并根据下面的xml获得相应的“price_per_share”值。仅供参考,计算“最近日期”时,日期是过去还是将来无关紧要。

我该怎么做?

我在考虑

  1. 计算今天与每个“日期”值之间的差异
  2. 然后为每个“详细信息”节点添加“差异”作为“详细信息”的子项
  3. 然后按最小的“持续时间”排序
  4. 然后提取第一次出现的“price_per_share”值。
  5. 但不知何故,添加一个孩子似乎也不适合我。

    <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。

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