我正在尝试将以下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
答案 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实现。