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

Улучшение принятого ответа о QPlainTextEdit. В дополнение к lineSpacing значение для setFixedHeight должно содержать: 2 поля лежащих в основе QTextDocument, 2 ширины кадра и поля содержимого виджета. Кроме того, QFontMetrics должен быть получен из шрифта документа, а не из самого виджета. Итак, гипотетическая функция setHeight должна выглядеть следующим образом:

void setHeight (QPlainTextEdit *ptxt, int nRows)
{
    QTextDocument *pdoc = ptxt->document ();
    QFontMetrics fm (pdoc->defaultFont ());
    QMargins margins = ptxt->contentsMargins ();
    int nHeight = fm.lineSpacing () * nRows +
        (pdoc->documentMargin () + ptxt->frameWidth ()) * 2 +
        margins.top () + margins.bottom ();
    ptxt->setFixedHeight (nHeight);
}
1
задан Shalini 13 July 2018 в 09:54
поделиться

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

5
ответ дан Harry Bakken 17 August 2018 в 13:14
поделиться
  • 1
    Гарри Баккен, спасибо :) Сейчас он работает. – Shalini 13 July 2018 в 11:44
  • 2
    xdmp: parse-dateTime, предложенный Далдей, тоже работает, но наиболее полезен с текстовыми месяцами (декабрь / 31/2016). Даты, подобные этим, легко нормализуются с помощью строковых манипуляций. Следующая библиотека способна обрабатывать множество нечетных форматов даты, вызывая некоторые проблемы из ваших рук: github.com/grtjn/ml-datetime – grtjn 13 July 2018 в 14:46

Что вы сделали в своем коде, создается 2 xs: строковые переменные, а затем сравниваются с ними lexicaly. (например, «12/31/2016» по сравнению с «мм / дд / гггг»). Это будет сравниваться в соответствии с локалью, поскольку строка сравнивает не сопоставление даты. Есть только несколько форматов, которые сравнивают lexicaly так же, как и введенное значение даты, xs: date является одним из них, его формат - YYYY-MM-DD, который обладает свойством быть сравнимой лексикой, а также типизированной датой. В общем, предпочтительнее не полагаться на это и вместо этого конвертировать в xs: date или xs: dateTime и сравнивать значение dateTime. - Процедура такая же, вам нужно принуждать эти текстовые значения в стандартную форму даты либо с помощью xdmp : parse-dateTime () или аналогичные функции с учетом формата, или путем разбора текстового формата и получения формата xs: date (). Затем сравните два типизированных значения даты.

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

2
ответ дан DALDEI 17 August 2018 в 13:14
поделиться
  • 1
    Далдей. Спасибо за разъяснение. Теперь я понял эту концепцию. – Shalini 13 July 2018 в 11:45

Я использовал нижний подход -

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
1
ответ дан Shalini 17 August 2018 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: