Вы можете использовать functx:last-day-of-month()
и другие стандартные функции даты, чтобы построить дату начала и окончания для данного года и квартала.
Пример кода ниже вернет последовательность из 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)
Вы можете улучшить это, чтобы вместо этого построить и вернуть 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)