XQuery - 按日期范围过滤

时间:2012-03-07 12:30:50

标签: xquery

我正在尝试将以下SQL语句转换为XQuery

SELECT *
FROM Customers
WHERE (OrderDate BETWEEN #1997/1/1# and #1998/1/1#)

此声明将返回订单日期介于1/1/1997和1/1/1998之间的所有记录#

我不确定如何编写where语句。由于订单日期在xml文件中以这样的方式写入

<OrderDate>1996-07-04T00:00:00</OrderDate>

这就是我现在所拥有的但仍然不起作用

for $x in doc("Orders.xml")/dataroot/Customers
where //Customers[OrderDate>1997/1/1][OrderDate<1998/1/1]

return $x

2 个答案:

答案 0 :(得分:2)

在简单的XQuery中,你会写出类似的东西:

for $x in doc("Orders.xml")/dataroot/Customers
let $date as xs:dateTime := $x/OrderDate
where $date gt xs:dateTime("1996-01-01T00:00:00")
  and $date lt xs:dateTime("1998-01-01T00:00:00")
return  
    $x

HTH!

答案 1 :(得分:1)

以下内容已经过测试,可以在当前版本的BaseX上运行,也可以在XML Spy 2012中运行:

let $doc :=
    <dataroot>
        <Customers>
            <OrderDate>1996-07-04T00:00:00</OrderDate>
        </Customers>
    </dataroot>

return $doc/Customers
    [xs:dateTime(./OrderDate/text()) gt xs:dateTime("1996-01-01T00:00:00")]
    [xs:dateTime(./OrderDate/text()) lt xs:dateTime("1998-01-01T00:00:00")]

...返回的地方是:

<Customers><OrderDate>1996-07-04T00:00:00</OrderDate></Customers>

...但是,grtjn的示例也在BaseX上正确运行,并且不依赖于查询优化器注意到OrderDate/text()不需要两次转换才能高效。除非您的代码将在针对Altova引擎的生产中运行,否则我建议使用更新的XQuery实现。