2017-10-09 5 views
0

$ today = 현재 시스템 날짜를 정의했습니다.오늘부터 가장 가까운 날짜 찾기

목표 : 오늘부터 가장 가까운 "date"요소의 값을 찾아서 아래의 xml을 기반으로 해당하는 "price_per_share"값을 얻습니다. 참고로, "가장 가까운 날짜"를 계산할 때 날짜가 과거인지 미래인지는 중요하지 않습니다.

어떻게해야합니까?

오늘 각 "날짜"값 사이의 차이를 계산

  1. 의 생각

  2. 그런
  3. 그런 다음 각 "세부 사항"에 대한 "세부 사항"의 자식으로 "차이"노드를 추가 가장 작은 "기간"으로 정렬하십시오.
  4. 그런 다음 "price_per_share"값의 첫 번째 항목을 추출하십시오.

하지만 어쨌든 아이를 추가하는 것은 나에게도 효과가없는 것 같습니다. 내가 XQuery를 1.0을 사용하도록 제한하고 같이

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

는 "지도"를 사용할 수 없습니다.

답변

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')의 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 xquery-operators/# constructor-functions-for-xsd-types –

+0

saxon8.jar (XQuery 1.0을 지원해야 함) 및 xquisitor-1.0a5를 사용하는 XQuisitor (xquery 작업을위한 독립 실행 형 도구)를 사용하고 있습니다. .항아리. – user8748135