XQuery - фильтрация по диапазону дат - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь преобразовать следующий оператор SQL в XQuery

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

Этот оператор будет возвращать все записи с датой заказа между 01.01.1997 и 01.01 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 ]

2 голосов
/ 07 марта 2012

В простом 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 голос
/ 09 марта 2012

Следующие тесты работали, как и ожидалось, в текущей версии 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.

...