2012-12-25 61 views
1

根據事實我有這個XML文件:的XQuery:最快的方法來檢查日期

<entries> 
    <entry date="2012-10-09T12:09:09">...</entry> 
    <entry date="2012-10-09T14:19:23">...</entry> 
    ... 
    <entry date="2012-10-13T00:00:00">...</entry> 
</entries> 

而且$dateBegin := '2012-10-09T13:00:00'$dateEnd := '2012-10-12T00:00:00'。我正在尋找一種有效的方法來獲取$ dateBegin和$ dateEnd之間的任何想法?

+0

XML文檔中的條目是按日期排序的嗎? –

+0

是的,確切地說。 – Rob

+0

您正在使用哪個查詢處理器?性能往往很大程度上取決於實施。 –

回答

1

使用由羅布(在OP)的事實證實,該entry元素出現在XML文檔中的排序,這可能會更快

for $dateBegin in xs:dateTime('2012-10-09T13:00:00'), 
    $dateEnd in xs:dateTime('2012-10-12T00:00:00') 
    return 
      /*/*[xs:dateTime(@date) ge $dateBegin 
       and 
       . << /*/*[xs:dateTime(@date) gt $dateEnd][1] 
       ] 

當這個XQuery的是對所提供的XML評估文件:

<entries> 
    <entry date="2012-10-09T12:09:09">...</entry> 
    <entry date="2012-10-09T14:19:23">...</entry> 
    ... 
    <entry date="2012-10-13T00:00:00">...</entry> 
</entries> 

想要的,正確的結果產生:

<entry date="2012-10-09T14:19:23">...</entry> 
+0

感謝您的回答。不幸的是,它仍然需要很長時間才能繼續,我的XML文件包含近90000個條目。 – Rob

+0

@Rob,如果開始日期位於文檔的開始位置,並且結束日期位於文檔的末尾,則沒有任何幫助。如果兩個日期都在文檔的最後,那麼情況也是如此。如果日期接近開始,那麼這應該快速運行。另外,如果確保開始日期和結束日期等於文檔中的日期,則可以使用XSLT和鍵 - 查找開始條目和結束條目 - 這是O(1)。如果確保按位置訪問序列爲O(1)(如在Saxon中),則可以編寫二進制搜索來定位起始和結束「入口」 –

0

好吧所以最後我意識到let $entries := //entry[(xs:dateTime(./@date/string()) ge $dateBegin) and (xs:dateTime(./@date/string()) le $dateEnd)]的作品。仍然想知道是否有更好的解決方案。

0

對於爲集合定義的entry/@ date屬性,您是否有範圍索引?如果不是,我相信會加快查詢速度。

相關問題