Xquery 如何在marklogic中对字符串日期排序?
我们必须在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
“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"))