Расчет квартальных дат [XQuery] - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь сгенерировать отчет, который извлекает квартальный отчет, т.е. на основе startDate и endDate. Как рассчитать startDate и endDate любого квартала, если у меня есть имя квартала в качестве Q1 и год в качестве параметров в XQuery или Marklogic.

Пример: если у меня Quarter = q1 и Year = 2018 в качестве параметров, тогда мне нужно получить startDate как 01-01-2018 и endDate как 31-03-2018

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете использовать 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)
...