Xquery Marklogic中的日期格式问题
我正在使用Xquery Marklogic中的日期格式问题,xquery,marklogic,Xquery,Marklogic,我正在使用xdmp:documentfilter(doc(uri))从文档中获取元数据。在其中一个文档上运行此命令时,会得到以下结果:- xdmp:documentfilter(doc(“/Vision.doc”)/*:meta[@name eq“Creation_Date”]/@content <?xml version="1.0" encoding="UTF-8"?> <results warning="attribute node"> <warning w
xdmp:documentfilter(doc(uri))
从文档中获取元数据。在其中一个文档上运行此命令时,会得到以下结果:-
xdmp:documentfilter(doc(“/Vision.doc”)/*:meta[@name eq“Creation_Date”]/@content
<?xml version="1.0" encoding="UTF-8"?>
<results warning="attribute node">
<warning warning="attributes cannot be root nodes" content="17-05-2012 00:48:00"/>
</results>
当我在另一个文档上运行此命令时,我得到:-
<?xml version="1.0" encoding="UTF-8"?>
<results warning="attribute node">
<warning warning="attributes cannot be root nodes" content="2012-06-03T13:45:00Z"/>
</results>
您可以看到两个输出中的日期格式不同。在Marklogic Server中上载的文档中可能有不同的日期格式。但我想以某种固定格式显示文档的创建日期(例如2012年5月16日)。如何将不同的日期格式转换为固定日期格式?我还想将这些日期与用户输入的日期进行比较。搜索查询应返回与搜索条件匹配的文档。所以我这里有两个问题:-
您必须解析dateTime值。例如:
let $dt := "17-05-2012 00:48:00"
return
if ($dt castable as xs:dateTime)
then xs:dateTime($dt)
else xdmp:parse-dateTime("[Y01]-[M01]-[D01] [h01]:[m01]:[s01]", $dt)
这将返回一个
xs:dateTime
原子值,可以在UI中进行比较和显示。如果希望支持其他格式,则需要创建其他解析“picture”字符串,以便它们也可以转换为xs:dateTime
。有关详细信息,请参阅xdmp:parse-dateTime()
上的文档。您必须解析dateTime值。例如:
let $dt := "17-05-2012 00:48:00"
return
if ($dt castable as xs:dateTime)
then xs:dateTime($dt)
else xdmp:parse-dateTime("[Y01]-[M01]-[D01] [h01]:[m01]:[s01]", $dt)
这将返回一个
xs:dateTime
原子值,可以在UI中进行比较和显示。如果希望支持其他格式,则需要创建其他解析“picture”字符串,以便它们也可以转换为xs:dateTime
。有关更多信息,请参阅xdmp:parse-dateTime()
上的文档。作为一个更大的开源项目的一部分,我制作了一个日期解析库,该库用6种不同的语言处理至少20种不同的格式。如果尚未定义格式,也可以提供自己的格式。它的工作原理是以任何定义的格式将日期作为字符串提供给它,如果能够成功解析它,则返回xs:dateTime
。你可以在这里找到图书馆:
要使用它:
import module namespace dateparser="http://marklogic.com/dateparser" at "date-parser.xqy";
dateparser:parse($filteredDocument//*:meta[@name eq "Creation_Date"]/@content)
这将允许您规范化二进制文档可能具有的各种日期格式。我将注意到,不同的二进制格式(Word、PDF、JPEG等)将使用不同的名称作为创建日期。因此,根据您在MarkLogic中存储的格式,查找“Creation_Date”元数据可能会留下一些漏洞
还要注意的是,如果您只需要不带时间部分的日期信息,可以将xs:dateTime
转换为xs:date
。这样做将保留时区信息,这可能是一件好事
至于你的第二个问题
有许多不同的方法可以做到这一点,阅读一些MarkLogic文档是一个很好的开始。我建议您看看:
希望这将有助于了解您的查询需要的外观。以最简单的形式,您可能需要首先解析用户提供的日期。这也可以通过日期解析库来完成,这样用户就可以输入大量不同的日期格式(例如:2012年11月13日,甚至在西班牙小说《2012年11月13日》)。然后使用解析后的日期在MarkLogic中构造日期范围查询
如果这对我没有帮助的话,我会在这里发布另一个问题,详细说明你挂断电话的地方。作为一个更大的开源项目的一部分,我制作了一个日期解析库,用6种不同的语言处理至少20种不同的格式。如果尚未定义格式,也可以提供自己的格式。它的工作原理是以任何定义的格式将日期作为字符串提供给它,如果能够成功解析它,则返回
xs:dateTime
。你可以在这里找到图书馆:
要使用它:
import module namespace dateparser="http://marklogic.com/dateparser" at "date-parser.xqy";
dateparser:parse($filteredDocument//*:meta[@name eq "Creation_Date"]/@content)
这将允许您规范化二进制文档可能具有的各种日期格式。我将注意到,不同的二进制格式(Word、PDF、JPEG等)将使用不同的名称作为创建日期。因此,根据您在MarkLogic中存储的格式,查找“Creation_Date”元数据可能会留下一些漏洞
还要注意的是,如果您只需要不带时间部分的日期信息,可以将xs:dateTime
转换为xs:date
。这样做将保留时区信息,这可能是一件好事
至于你的第二个问题
有许多不同的方法可以做到这一点,阅读一些MarkLogic文档是一个很好的开始。我建议您看看:
希望这将有助于了解您的查询需要的外观。以最简单的形式,您可能需要首先解析用户提供的日期。这也可以通过日期解析库来完成,这样用户就可以输入大量不同的日期格式(例如:2012年11月13日,甚至在西班牙小说《2012年11月13日》)。然后使用解析后的日期在MarkLogic中构造日期范围查询
如果这样做没有帮助,我会在这里发布另一个问题,详细说明挂断的位置。此查询返回以下输出:-2022-11-02T00:00:00+05:30,这不是有效的日期时间值,我只想显示日期。我不希望时间和日期在一起。@Puneet-这实际上是一个有效的日期时间值。它是中定义的类型,也是索引中MarkLogic支持的类型。使用原子类型,您可以使用xdmp dateTime函数创建格式化字符串-例如:
fn:format dateTime(xs:dateTime(“2022-11-02T00:00:00+05:30”),“[Y01]/[M01]/[D01]”=>22/11/02
This query retur