2

是否可以在 xquery 中获取前一周的天数(周一至周日)?

4

2 回答 2

2

另一种解决方案,恰好是纯 XPath 2.0 表达式

for $vSunday in xs:date('2012-07-08'),
    $thisWeekDay in
       abs((current-date() - $vSunday) div xs:dayTimeDuration('P1D'))
      mod 7 +1,
    $lastWeekSunday in
       current-date() - xs:dayTimeDuration(concat('P',$thisWeekDay+7,'D')),
    $i in 1 to 7,
    $d in $lastWeekSunday + xs:dayTimeDuration(concat('P', $i, 'D'))
  return
    (concat(year-from-date($d),
            '-', month-from-date($d),
            '-', day-from-date($d)),
     ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
                                                                        [$i],
     '
')

今天(2012-07-08)运行时,结果是

 2012-7-1 Sunday 
 2012-7-2 Monday 
 2012-7-3 Tuesday 
 2012-7-4 Wednesday 
 2012-7-5 Thursday 
 2012-7-6 Friday 
 2012-7-7 Saturday 
于 2012-07-08T18:16:44.440 回答
0

看看FunctX XQuery Library,它们提供了一个很好的概述以及一些额外的日期函数。

使用这种模式来例如。计算 7 天前的日期:

fn:current-date() - xs:dayTimeDuration('P7D')

FunctX'day-of-week()将帮助您计算日期的星期几。

由于解析整个 FunctX 库会使您的查询变得非常慢(取决于您的 XQuery 引擎),因此可能只复制您需要的代码。

此代码将返回过去 7 天的工作日(上周被视为一个时期)。functx:day-of-week该代码包括 Gunther在评论中描述的修复:

declare namespace functx = "http://www.functx.com"; 
declare function functx:day-of-week 
  ( $date as xs:anyAtomicType? )  as xs:integer? {

  if (empty($date))
  then ()
  else xs:integer((xs:date($date) - adjust-date-to-timezone(xs:date('1901-01-06'), timezone-from-date(xs:date($date)))
          div xs:dayTimeDuration('P1D')) mod 7
 } ;

for $day in 1 to 7
let $date := fn:current-date() - xs:dayTimeDuration(concat('P', 8-$day, 'D'))
return <day date="{ $date }">{ functx:day-of-week($date) }</day>

如果这不是您正在寻找的(请始终在您的问题中包含您考虑过的一些代码、输入和预期输出),我相信您将能够对其进行更改以满足您的需求。

于 2012-07-08T16:55:36.413 回答