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

如何使用XQuery获取指定起止日期之间的所有月份?

获取两个日期之间所有月份的XQuery实现方案

给定开始日期2022-03-17和结束日期2022-06-17,需要输出格式为2022-03,2022-04,2022-05,2022-06的月份列表,以下是两种可行的XQuery实现方案:

方案一:基于年月范围遍历

通过提取日期的年、月信息,遍历年份和对应月份范围生成目标序列:

let $start-date := xs:date('2022-03-17')
let $end-date := xs:date('2022-06-17')
let $start-year := year-from-date($start-date)
let $start-month := month-from-date($start-date)
let $end-year := year-from-date($end-date)
let $end-month := month-from-date($end-date)
let $months := 
  for $year in $start-year to $end-year
  let $month-start := if ($year eq $start-year) then $start-month else 1
  let $month-end := if ($year eq $end-year) then $end-month else 12
  for $month in $month-start to $month-end
  return concat($year, '-', format-integer($month, '00'))
return string-join($months, ',')

逻辑说明

  1. 提取开始、结束日期的年和月数值
  2. 遍历从开始年份到结束年份的所有年份
  3. 对每个年份,确定需要遍历的月份范围(开始年份从起始月开始,结束年份到结束月为止,中间年份覆盖1-12月)
  4. 将每个年月格式化为YYYY-MM的字符串
  5. 用string-join将所有月份字符串拼接为逗号分隔的结果

方案二:递归逐月生成

通过递归方式逐月递增日期,直到超过结束日期,生成对应的月份字符串:

let $start-date := xs:date('2022-03-17')
let $end-date := xs:date('2022-06-17')

declare function local:generate-months($current as xs:date, $end as xs:date) as xs:string* {
  let $next-month := $current + xs:yearMonthDuration('P1M')
  return
    if ($current gt $end)
    then ()
    else (concat(year-from-date($current), '-', format-integer(month-from-date($current), '00')), 
          local:generate-months($next-month, $end))
};

return string-join(local:generate-months($start-date, $end-date), ',')

逻辑说明

  1. 定义递归函数local:generate-months,接收当前日期和结束日期参数
  2. 计算当前日期的下一个月日期
  3. 如果当前日期超过结束日期,返回空序列;否则生成当前日期的年月字符串,并递归处理下一个月
  4. 调用递归函数生成所有月份序列,最后拼接为逗号分隔的结果

两种方案运行后,针对给定的输入日期,都会输出目标结果:2022-03,2022-04,2022-05,2022-06

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:45:47