2012-03-07 116 views
1

我想下面的SQL語句轉換爲XQuery的的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

您正在使用哪種XQuery實現? – 2012-03-08 14:13:10

+0

我正在使用Altova XML Spy - Xquery 1.0 – 2012-03-08 22:48:09

+0

我注意到你沒有接受任何答案。你還沒有工作查詢嗎? – 2012-03-10 18:41:14

回答

1

下已經過測試,操作上BaseX的當前版本預期,而且在XML間諜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上正常運行,並且不依賴於查詢優化器注意不需要兩次鑄造以提高效率。除非您的代碼將在生產環境中針對Altova的引擎運行,否則我會建議使用更新的XQuery實現。

+0

修改後謝謝你,它似乎有效。你是天賜之物,我非常欣賞它 – 2012-03-11 22:53:16

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!

+0

執行代碼時我仍然收到錯誤,錯誤如下 XQuery執行錯誤! 預期的原子項目 - 當前項目是在xs類型元素的'OrderDate':dateTime – 2012-03-07 13:22:44

+1

@PeterRoche嘗試使它成爲'$ x/OrderDate/data()'。一般的方法@grtjn在這裏,將值轉換爲xs:dateTime進行比較是正確的。 – 2012-03-07 17:09:39

+0

@PeterRoche據我所知,解析器應該在這裏應用自動類型轉換,但也許我傾向於解析器的特定行爲。查爾斯的建議可能會奏效。如果沒有,將他的表達式換成xs:dateTime類型cast:'xs:dateTime($ x/OrderDate/data())' – grtjn 2012-03-07 20:03:47