如何在marklogic中对字符串日期进行排序?

时间:2018-05-18 06:34:24

标签: xquery marklogic

我们必须在marklogic中对年份和月份组合进行排序 防爆。 "2018 April", "2018 Dec", "2018 Feb", "2018 Nov"

按字母顺序排序,但我想根据月份和年份进行排序。

2 个答案:

答案 0 :(得分:1)

您必须将这些值标准化,这是肯定的。您可以标准化为:

  • xs:date(正如Martin建议的那样)
  • 或xs:gYearMonth

您可以在摄取时或在运行时这样做。

对摄取进行此操作可以利用MarkLogic范围索引来支持排序,例如cts:index-ordercts:search结合使用。

在运行时,您也可以转换为xs:date或xs:gYearMonth(在动态规范化之后),但您也可以直接在规范化字符串上进行排序,而无需强制转换。在运行时进行排序和规范化会表现得更糟,而且不能很好地扩展。

关于规范化本身,您可以使用Martin描述的字符串操作,但您也可以使用MarkLogic函数xdmp:parse-dateTime,例如:

xs:gYearMonth(xdmp:parse-dateTime("[Y] [Mn]", "2018 Jan"))

它需要额外的参数来表示语言等。

HTH!

答案 1 :(得分:0)

您当然可以尝试将格式转换为xs:date并使用order by,例如。

let $seq := ("2018 Apr", "2018 Dec", "2018 Feb", "2018 Nov"),
  $month-order := ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
for $date in $seq
order by xs:date(
          substring($date, 1, 4) 
          || '-' 
          ||format-number(index-of($month-order, substring($date, 6, 3)), '00') 
          || '-01')
return $date

给出

"2018 Feb"
"2018 Apr"
"2018 Nov"
"2018 Dec"

请注意,我通过假设一致的三个月的月份名称来简化任务。我不熟悉您使用的特定XQuery处理器Marklogic是否有一些自定义日期解析函数,使任务更容易,我只是使用XQuery 3.1函数和表达式。在https://xqueryfiddle.liberty-development.net/948Fn59

进行演示