0

次の XML が与えられた場合、誕生日が近い連絡先 (たとえば 10 日以内) を見つけるにはどうすればよいでしょうか?

<contacts>
  <contact>
    <name>bob</name>
    <birthday>1978-05-06</birthday>
  </contact>
  <contact>
    <name>mary</name>
    <birthday>1955-06-06</birthday>
  </contact>
  <contact>
    <name>john</name>
    <birthday>1998-05-06</birthday>
  </contact>
</contacts>

次の xpath を取得しましたが、month-from-dateTime が「0」で埋められた文字列 (05) ではなく整数 (5) を返すため、うまくいきません。文字列を連結する醜いハックの代わりに、日、月、年の整数パラメーターを受け入れる Xpath で日付を作成する方法はありますか?

/contacts/contact[days-from-duration(xs:dateTime(concat(year-from-dateTime(current-date()),'-',month-from-dateTime(xs:dateTime(birthday)),'-',day-from-dateTime(xs:dateTime(birthday)))) - current-date()) < 10]
4

1 に答える 1

1

yearMonthDuration を使用して、日付を現在の年に移動するのに十分な年数を追加できます。

/contacts/contact[ 
  xs:dateTime(birthday) + xs:yearMonthDuration("P1Y") * (year-from-dateTime(current-date()) -  year-from-dateTime(xs:dateTime(birthday))) < current-date() + xs:dayTimeDuration("P10D")
]

そして、誕生日が過去のものではないことを確認するには (let のような作業では、ここですべてを 2 回入力することを避けます):

/contacts/contact[ 
  for $thisYearBirthDay in xs:dateTime(birthday) + xs:yearMonthDuration("P1Y") * (year-from-dateTime(current-date()) -  year-from-dateTime(xs:dateTime(birthday)))  
  return $thisYearBirthDay >= current-date() and $thisYearBirthDay < current-date() + xs:dayTimeDuration("P10D")
]

ただし、実際に機能させるには、現在の日付がクリスマス前後の場合に備えて、現在と翌年を確認する必要があります。たとえば、次のようになります。

/contacts/contact[ 
  exists((for $delta in (0, 1) return xs:dateTime(birthday) + xs:yearMonthDuration("P1Y") * ($delta + year-from-dateTime(current-date()) -  year-from-dateTime(xs:dateTime(birthday))))[. >= current-date() and . < current-date() + xs:dayTimeDuration("P10D")])
]
于 2013-06-04T12:47:41.330 に答える