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

Xquery 如何在marklogic中对字符串日期排序?,xquery,marklogic,Xquery,Marklogic,我们必须在marklogic中对年和月组合进行排序 例如 “2018年4月”, “2018年12月”, “2018年2月”, “2018年11月” 它是根据字母顺序排序的,但我想根据月份和年份进行排序。您当然可以尝试将格式转换为xs:date,并使用顺序,例如 let $seq := ("2018 Apr", "2018 Dec", "2018 Feb", "2018 Nov"), $month-order := ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'J

我们必须在marklogic中对年和月组合进行排序 例如

“2018年4月”,
“2018年12月”,
“2018年2月”,
“2018年11月”


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

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

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
给予


请注意,我通过假设一个三个字母的月名来简化任务。我不熟悉您使用的特定XQuery处理器Marklogic,不管它是否有一些自定义的日期解析函数,使任务更容易,我只是使用了XQuery 3.1函数和表达式。在

工作时,您必须规范化这些值,这是肯定的。您可以正常化为:

  • 日期(正如马丁所建议的那样)
  • 或xs:gYearMonth
您可以在摄取时或运行时执行此操作

在摄取时这样做允许利用MarkLogic范围索引来支持排序,例如结合使用

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

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

xs:gYearMonth(xdmp:parse-dateTime("[Y] [Mn]", "2018 Jan"))
它需要额外的参数来指示语言等等


那么确切的格式是什么呢?奇怪的是,在几个月里,你有一个三个字母的缩写,比如
Dec
,但是全名是
April
xs:gYearMonth(xdmp:parse-dateTime("[Y] [Mn]", "2018 Jan"))