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 返回一个整数 (5) 而不是 '0' 填充字符串 (05)。有没有一种方法可以在 Xpath 中构建一个日期,该日期将接受日、月、年的整数参数,而不是我丑陋的 hack 连接字符串?

/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 避免在此处输入两次这样的作品):

/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 回答