You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XQuery 1.0中生成起止日期间的日期列表?

嘿,我来帮你搞定这个XQuery日期列表的问题!你之前遇到的错误很典型——XQuery里的to运算符只支持数值类型(整数、浮点数这类),把日期转成字符串后肯定没法用它来循环。咱们换个思路,直接用日期类型来逐个生成月份,再格式化成你要的YYMM样式就行。

解决方案(XQuery 1.0兼容版)

这个版本用递归函数来逐个生成月份,适合所有支持XQuery 1.0的环境:

xquery version "1.0";

(: 定义起始和结束日期,保留xs:date原生类型,别转字符串 :)
let $start-date := current-date()
let $end-date := current-date() + xs:yearMonthDuration("P2Y6M")

(: 递归生成每个月份的起始日期,直到超过结束日期 :)
declare function local:generate-month-dates($current-date as xs:date, $end-date as xs:date) as xs:date* {
    if ($current-date gt $end-date)
    then ()
    else ($current-date, local:generate-month-dates($current-date + xs:yearMonthDuration("P1M"), $end-date))
};

(: 把每个日期格式化成YYMM格式:年份后两位+补零的月份 :)
let $month-list := for $date in local:generate-month-dates($start-date, $end-date)
                   return concat(
                       substring(xs:string(year-from-date($date)), 3, 2),  (: 截取年份的最后两位 :)
                       format-number(month-from-date($date), '00')       (: 月份不足两位时补零,比如1→01 :)
                   )

(: 用空格把所有结果拼接成字符串输出 :)
return string-join($month-list, ' ')

更简洁的XQuery 3.0+版本

如果你的环境支持XQuery 3.0或更高,可以用数值循环来实现,代码更直观:

xquery version "3.0";

let $start-date := current-date()
let $end-date := current-date() + xs:yearMonthDuration("P2Y6M")

(: 计算从起始到结束的总月份数,用来生成循环次数 :)
let $total-months := (year-from-date($end-date) - year-from-date($start-date)) * 12 
                     + (month-from-date($end-date) - month-from-date($start-date)) 
                     + 1  (: 加1是为了包含起始月份本身 :)

(: 循环每个月份偏移量,生成对应日期再格式化 :)
let $month-list := for $i in 0 to $total-months - 1
                   let $current-date := $start-date + xs:yearMonthDuration(concat('P', $i, 'M'))
                   return concat(
                       substring(xs:string(year-from-date($current-date)), 3, 2),
                       format-number(month-from-date($current-date), '00')
                   )

return string-join($month-list, ' ')

关键细节说明

  • 为什么不用字符串?xs:date类型自带日期运算能力,能自动处理像“3月31号加一个月变成4月30号”这种边界情况,避免手动处理日期的麻烦。
  • 格式化部分:substring截取年份最后两位,format-number确保月份始终是两位数字(比如5→05),完全符合你要的1901这种格式。

内容的提问来源于stack exchange,提问作者Valentin Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:15