如何比较MarkLogic中的日期?

Sha*_*ini 1 xquery marklogic

我在$ doc变量中使用了以下XML

 let $doc := <root>
              <date>12/31/2016</date>
             </root>
Run Code Online (Sandbox Code Playgroud)

我想把这个日期与今天的日期进行比较.它应该归还给我,但它却让我失意.

我使用以下代码 -

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
Run Code Online (Sandbox Code Playgroud)

有什么建议 ?

小智 5

您需要将日期字符串转换为xs:date,以便能够以这种方式比较它们.使用格式化fn:format-date()只生成一个字符串,同时fn:current-date()返回一个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
Run Code Online (Sandbox Code Playgroud)

如果日期以xs:date格式保留,则可以简化为:

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

return xs:date($doc/date/text()) le fn:current-date() 
Run Code Online (Sandbox Code Playgroud)

然后,您还可以使用日期元素上的范围索引cts:element-range-query()来选择符合所需条件的文档,等等.以这种方式保留日期.