如何使用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-12月)
- 将每个年月格式化为
YYYY-MM的字符串 - 用
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), ',')
逻辑说明
- 定义递归函数
local:generate-months,接收当前日期和结束日期参数 - 计算当前日期的下一个月日期
- 如果当前日期超过结束日期,返回空序列;否则生成当前日期的年月字符串,并递归处理下一个月
- 调用递归函数生成所有月份序列,最后拼接为逗号分隔的结果
两种方案运行后,针对给定的输入日期,都会输出目标结果:2022-03,2022-04,2022-05,2022-06
内容的提问来源于stack exchange,提问作者Balan
相关产品推荐
相关产品推荐

