如何用MarkLogic Optic API的op:where()过滤30天前的时间戳数据
解决MarkLogic Optic API过滤30天内数据的问题
你可以通过两种可行方式实现需求,具体方案如下:
方案一:使用Optic原生算子(推荐)
直接借助Optic提供的日期时间函数构建过滤条件,避开SQL语法兼容问题:
op:where( op:gte( op:col("MyData.testDateTime"), op:subtract-dateTime-dayTimeDuration( op:current-dateTime(), op:dayTimeDuration("P30D") ) ) )
op:current-dateTime():获取当前带时区的完整时间戳op:dayTimeDuration("P30D"):定义30天的时长op:subtract-dateTime-dayTimeDuration:计算出30天前的时间节点op:gte:保留时间戳晚于等于30天前的数据,也就是排除早于30天的行
方案二:使用MarkLogic兼容的SQL条件
如果坚持使用op:sql-condition,需要用MarkLogic SQL支持的标准语法:
op:where(op:sql-condition("MyData.testDateTime >= CURRENT_TIMESTAMP - INTERVAL '30' DAY"))
MarkLogic SQL不支持DATEADD、GETDATE()这类非标准函数,也不认可CURRENT_DATE - 30这种简化写法,必须用INTERVAL '30' DAY来表示时长;同时用CURRENT_TIMESTAMP匹配xs:dateTime类型的字段(如果用CURRENT_DATE会自动补00:00:00的时间部分,也能生效,但CURRENT_TIMESTAMP更精准)。
内容的提问来源于stack exchange,提问作者Mike J
相关产品推荐
相关产品推荐

