Как сравнить даты в MarkLogic?

У меня ниже XML в переменной $doc

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

Я хочу взять эту дату и сравнить ее с сегодняшней датой. Это должно вернуть мне Истину, но возвращает мне ложь.

Я использую приведенный ниже код

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

какие-либо предложения?

3 ответа

Решение

Вам нужно привести строку даты как 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

Если дата сохраняется в формате 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() таким образом выбрать документы, которые соответствуют вашим желаемым критериям и т. д., когда дата будет сохранена.

То, что вы сделали в своем коде, создается 2 xs: строковые переменные, затем сравнивая их лексически (например, "31.12.2016" сравнить с "мм / дд / гггг") Это будет сравнивать в соответствии с языковым стандартом, поскольку сравнение строк, а не сравнение дат. Есть только несколько форматов, которые сравнивают лексически так же, как по введенному значению даты, 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
Другие вопросы по тегам