跳转到内容

XQuery/基于时间的查询

来自维基教科书,开放的书籍,开放的世界

您想要根据日期时间信息查找集合中的项目。

默认情况下,XML 文件使用标准 ISO dateTime 结构来存储时间信息。与存储时间相关的两种主要 XML 数据类型是

xs:date - 用于以 YYYY-MM-DD 格式存储仅日期。xs:dateTime - 用于存储日期和时间。

还有许多其他用于存储仅年份、月份、日期和时间等的结构,但此示例仅涵盖日期和日期时间。

示例事件结构

[编辑 | 编辑源代码]

在以下示例中,我们将使用简单的日期结构存储“事件”数据。事件将只有一个开始日期或一个包含开始日期和结束日期的日期范围。

<event>
   <id>6</id>
   <name>Architecture Tradeoff Analysis</name>
   <start-date>2011-04-07</start-date>
   <end-date>2011-04-21</end-date>
</event>

您可以使用以下 xquery 结构找到在任何特定时间点发生的事件。

来自 events-at-time.xq 的源代码

{: get a URL parameter to this XQuery :)
let $date := xs:date(request:get-parameter('date', ''))
(: create a sequence of all events :)
let $events := collection('/db/apps/timelines/data')//event

return
   {: return all events that start before the date AND end after the date :)
   for $event in $events[
      xs:date(./start-date/text()) lt $date
      and xs:date(./end-date/text()) gt $date
      ]
    return $event

您还可以基于日期时间结构设置非常快速的搜索,即使对于 100,000 个项目的大型集合也是如此,在您了解如何在 XML xs:dateTime 结构上配置范围索引后。请参阅:http://www.w3.org/TR/xmlschema-2/#dateTime 日期时间结构的工作方式。

以下页面包含有关索引的说明

http://exist-db.org/exist/apps/doc/indexing.xml

并确保阅读有关范围索引的第 2.2 节。

我还会在您的范围索引中使用 xs:date 和 xs:dateTime 结构。

如果您正在跟踪文档创建和修改日期时间,则您的集合配置文件(请参阅 http://exist-db.org/exist/apps/doc/indexing.xml#idxconf)可能包含以下几行

<create qname="start-date" type="xs:date"/>
<create qname="end-date" type="xs:date"/>
<create qname="created-dateTime" type="xs:dateTime"/>
<create qname="last-modified-dateTime" type="xs:dateTime"/>

请注意,所有 eXist 集合和资源在其元数据中也都有这两个日期。您可以使用 xmdb 模块获取这些时间戳

xmldb:created

xmldb:last-modified

其他资源

[编辑 | 编辑源代码]
华夏公益教科书