季度日期计算 [XQuery]

Quarterly Dates Calculation [XQuery]

我正在尝试生成一个报告,该报告获取季度报告,即基于开始日期和结束日期。如果我将季度名称作为 Q1 并将年份作为 XQuery 或 Marklogic 中的参数,如何计算任何季度的开始日期和结束日期。

示例:如果我将 Quarter=q1 和 Year=2018 作为参数,那么我需要将开始日期设置为 01-01-2018 并将结束日期设置为 31-03-2018

您可以使用 functx:last-day-of-month() 和其他标准日期函数来构造给定年份和季度的开始和结束日期。

下面的示例代码将 return 一系列 xs:date 对象,第一个是开始日期,第二个是结束日期。

xquery version "1.0-ml";
import module namespace functx = "http://www.functx.com" 
  at "/MarkLogic/functx/functx-1.0-doc-2007-01.xqy";

declare function local:quarter-range($year as xs:integer, $quarter as xs:integer) {
  let $month := 3 * $quarter
  let $end :=  xs:date($year || "-"|| substring(string(100 + $month), 2)||"-01")
  let $start-date := $end - xs:yearMonthDuration("P2M")
  let $end-date := functx:last-day-of-month($end)
  return
     ($start-date, $end-date)
};

local:quarter-range(2018, 2)

您可以增强它,而不是构建 return 一个 cts:and-query()cts:element-range-query:

xquery version "1.0-ml";
import module namespace functx = "http://www.functx.com" 
  at "/MarkLogic/functx/functx-1.0-doc-2007-01.xqy";

declare function local:quarter-range(
    $element as xs:QName, 
    $year as xs:integer, 
    $quarter as xs:integer) 
as cts:query 
{
  let $month := 3 * $quarter
  let $end :=  xs:date($year || "-"|| substring(string(100 + $month), 2)||"-01")
  let $start-date := $end - xs:yearMonthDuration("P2M")
  let $end-date := functx:last-day-of-month($end)
  return
     cts:and-query((
       cts:element-range-query($element, ">=", $start-date), 
       cts:element-range-query($element, "<=", $end-date)
     ))
};

local:quarter-range(xs:QName("myDateElement"), 2018, 2)