如何比较 MarkLogic 中的日期?

How to compare Dates in MarkLogic?

我在 $doc 变量

中有以下 XML
 let $doc := <root>
              <date>12/31/2016</date>
             </root>

我想把这个日期和今天的日期进行比较。它应该 return 我是对的,但它 return 我是假的。

我正在使用下面的代码-

let $doc := <root>
              <date>12/31/2016</date>
             </root>


let $date := $doc/date/text()
let $today :=fn:format-date(fn:current-date(),"[M01]/[D01]/[Y0001]")
return $date le $today

有什么建议吗?

您需要将日期字符串转换为 xs:date 才能以这种方式比较它们。使用 fn:format-date() 格式化只生成一个字符串,而 fn:current-date() returns 一个 xs:date。这个片段完成了你想要的,但你可能还想考虑在你的文档中以 xs:date 格式持久化数据,即 <date>2016-12-31</date>

let $doc := 
    <root>
        <date>12/31/2016</date>
    </root>
let $date-string := $doc/date/text()
let $date-parts := fn:tokenize($date-string,"/")

(: rearrange date parts into yyyy-mm-dd string and cast as xs:date :)
let $date := xs:date(fn:concat($date-parts[3],"-",$date-parts[1],"-",$date-parts[2]))

let $today := fn:current-date()

return $date le $today

=> false

如果日期以xs:date格式持久化,可以这样简化:

let $doc := 
    <root>
        <date>2016-12-31</date>
    </root>

return xs:date($doc/date/text()) le fn:current-date() 

然后,您还可以在日期元素上使用范围索引,以利用 cts:element-range-query() 到 select 满足所需条件的文档,等等。当日期以这种方式保存时。

您在代码中所做的是创建 2 个 xs:string 变量,然后对它们进行词法比较。 (例如,“12/31/2016”与 'mm/dd/yyyy' 相比) 这将根据语言环境进行比较,因为字符串比较不是日期比较。 只有少数格式在词汇上与键入的日期值进行比较,xs:date 就是其中之一,它的格式是 YYYY-MM-DD,它也具有在词汇上具有可比性的 属性按输入的日期。
一般来说,最好不要依赖它,而是转换为 xs:date 或 xs:dateTime 并按 dateTime 值进行比较——过程是相同的,您需要将这些文本值强制转换为标准日期格式通过使用 xdmp:parse-dateTime() 或给定手头格式的类似函数,或者通过解析文本格式并生成 xs:date() 想要的格式。然后比较 2 个键入的日期值。

https://docs.marklogic.com/xdmp:parse-dateTime

我使用了以下方法-

let $doc := <root>
          <date>12/31/2016</date>
         </root>


let $date := fn:format-date(xs:date(xdmp:parse-dateTime([Y0001]/[M01]/[D01]",$doc/date/text())),"[Y0001]/[M01]/[D01]")
let $today := fn:format-date(fn:current-date(),"[Y0001]/[M01]/[D01]")
return $date le $today