Как сравнить даты в 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 введенных значения даты.
Я использовал следующий подход:
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