【问题标题】:Quarterly Dates Calculation [XQuery]季度日期计算 [XQuery]
【发布时间】:2018-11-06 00:08:03
【问题描述】:

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

示例:如果我有 Quarter=q1 和 Year=2018 作为参数,那么我需要将 startDate 设置为 01-01-2018 并将 endDate 设置为 31-03-2018

【问题讨论】:

    标签: xquery marklogic marklogic-8 xquery-3.0


    【解决方案1】:

    您可以使用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:element-range-query 构造并返回cts:and-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)
    

    【讨论】:

    • 为什么这么花哨?这不像一个季度的最后一个日期会发生变化。如果 Q1 则 yyyy-01-01 到 yyyy-03-31。如果是 Q2,那么 yyyy-04-01 到 yyyy-06-30。等等。
    • 感谢 Mads Hansen,第二个选项创建 cts:query 对我更有帮助。
    • 很高兴听到这个消息。日期函数显示了如何进行一些日期数学运算和计算日期,但正如@hunterhacker 指出的那样,您可以简化它并用静态查找替换一些逻辑并连接适当的日期值。
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多