如何在MarkLogic中忽略时区,仅按本地时间范围搜索etTime字段?
在MarkLogic中忽略时区偏移比较时间字段的方法
你的集合中有如下记录:
{utcTime: "13:28:00+0000", utc: 1329398880000, etDate: "02/16", etTime: "08:28:00-0500"} {utcTime: "13:02:00+0000", utc: 1333976569000, etDate: "04/09", etTime: "09:02:00-0400"} {utcTime: "13:14:00+0000", utc: 1398172449000, etDate: "04/22", etTime: "09:14:00-0400"}
默认情况下,MarkLogic会将etTime的时区转换为UTC进行比较,导致不符合预期的结果。要实现只比较时间部分、忽略时区偏移的需求,可以用以下几种方法:
方法1:字符串截取直接比较
利用etTime的固定格式(HH:mm:ss±ZZZZ),提取前8位时间字符串,通过字符串范围匹配筛选结果。指定codepoint排序规则确保按字符顺序准确比较:
cts:search( collection("你的集合名称"), cts:and-query(( cts:element-range-query(xs:QName("etTime"), ">=", "09:00:00"), cts:element-range-query(xs:QName("etTime"), "<=", "09:30:00") ), "collation=http://marklogic.com/collation/codepoint") )
也可以在FLWOR表达式中手动截取后过滤:
for $doc in collection("你的集合名称") let $time-part := fn:substring($doc/etTime, 1, 8) where $time-part >= "09:00:00" and $time-part <= "09:30:00" return $doc
方法2:转换为xs:time并移除时区
将etTime解析为xs:time类型后,使用fn:adjust-time-to-timezone()移除时区信息,仅保留本地时间部分进行比较:
for $doc in collection("你的集合名称") let $time-value := xs:time($doc/etTime) let $local-time := fn:adjust-time-to-timezone($time-value, ()) where $local-time >= xs:time("09:00:00") and $local-time <= xs:time("09:30:00") return $doc
方法3:创建专用字段索引(优化性能)
如果这类查询频繁执行,建议通过字段索引提升性能:
- 在MarkLogic管理后台创建字段
etTimeLocal,配置提取规则为fn:substring(etTime, 1, 8) - 为该字段添加字符串范围索引
- 查询时直接使用字段范围查询:
cts:search( collection("你的集合名称"), cts:and-query(( cts:field-range-query("etTimeLocal", ">=", "09:00:00"), cts:field-range-query("etTimeLocal", "<=", "09:30:00") ), "collation=http://marklogic.com/collation/codepoint") )
以上方法都能精准筛选出时间部分在09:00:00到09:30:00之间的记录,忽略时区偏移影响。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

