【问题标题】:Filter Values of Current Week with XQuery使用 XQuery 过滤当前周的值
【发布时间】:2013-07-19 05:05:54
【问题描述】:

我正在使用 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

有人可以帮我写代码吗?

【问题讨论】:

    标签: xquery


    【解决方案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')))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多