使用XQuery过滤当前周的值

时间:2013-07-19 05:05:54

标签: xquery

我正在使用XQuery从Sharepoint中提取数据。 xquery代码是:

{for $ancestor0 in $queryresponse//*:row
return<Row>
<Title>{fn:data($ancestor0/@ows_Title)}</Title>
<EventDate>{fn:data($ancestor0/@ows_EventDate)}</EventDate>

返回的数据是:

<h1>Meeting Agenda  Event Date</h1>
New England APCD Work Group 6/26/2013  
NY APD Workgroup    6/27/2013  
MCDB 2012 Data Submission Bi-weekly 7/2/2013  
MA APCD 7/3/2013  
VA APCD Monthly Status  7/4/2013  
Cross State Meeting 7/5/2013  
NY APD Workgroup    7/11/2013  
MA APCD 7/17/2013  
Cross State Meeting 7/19/2013  
NY APD Workgroup    7/25/2013  
MA APCD 7/31/2013  
New England APCD Work Group 7/31/2013  
VA APCD Monthly Status  8/1/2013  
Cross State Meeting 8/2/2013

我需要获取当前周的行数吗?所以我只得到以下行作为结果:

MA APCD 7/17/2013  
Cross State Meeting 7/19/2013

有人可以帮我解决问题吗?

1 个答案:

答案 0 :(得分:1)

最后你需要解决两个问题。一个是解析这些日期,另一个是验证它们是否在本周。

测试日期是否在同一周

测试当天是否在当周是一个特殊情况,即一天是否在某一天的同一周,即当天的一天。

declare function local:in-current-week($date as xs:date)
as xs:boolean
{
  local:in-same-week(current-date(), $date)
};

为了测试某一天是否在某一周内,您需要找到一周的开始和结束。如果您知道星期几,那么找到星期的开始是很容易的。并且可以通过计算已知星期开始的天数来做到这一点(任意选择,让我们去参加1912年6月23日星期日)并使用剩下的除以一周的长度。

如果你想在星期一开始几个星期,只需将日期改为1,我会去1938年1月10日。

declare function local:in-same-week($date1 as xs:date, $date2 as xs:date)
as xs:boolean
{

  let $dayOfMonth := abs(($date1 - xs:date('1912-06-23')) div xs:dayTimeDuration('P1D') mod 7)
  let $startOfWeek := $date1 - $dayOfMonth * xs:dayTimeDuration('P1D')
  let $endOfWeek := $startOfWeek + 7 * xs:dayTimeDuration('P1D')
  return $startOfWeek <= $date2 and $date2 < $endOfWeek
};

local:in-current-week(xs:date('2013-07-17'))

从美国日期格式构建xs:date

这不仅仅涉及简单的正则表达式(对于所有日期AC都有效):

xs:date(replace('07/10/2013', '(\d{1,2})/(\d{1,2})/(\d+)', '$3-$1-$2'))

最后,您可以通过在查询中添加此where子句进行过滤:

where local:in-current-week(xs:date(replace(@ows_Title, '(\d{1,2})/(\d{1,2})/(\d{4})', '$3-$1-$2')))