2012-12-25 4 views
1

Selon le fait que j'ai ce fichier XML:XQuery: moyen le plus rapide pour vérifier les dates

<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> 

Et $dateBegin := '2012-10-09T13:00:00' et $dateEnd := '2012-10-12T00:00:00'. Je suis à la recherche d'un moyen efficace d'obtenir les entrées entre $ dateBegin et $ dateEnd, une idée?

+0

Les entrées du document XML sont-elles triées par date? –

+0

Oui, ils le sont, exactement. – Rob

+0

Quel processeur de requêtes utilisez-vous? Les performances ont tendance à dépendre fortement de la mise en œuvre. –

Répondre

1

En utilisant l'a confirmé par Rob (OP) fait que les entry éléments apparaissent classés dans le document XML, cela pourrait être plus rapide:

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] 
       ] 

Lorsque cette XQuery est évalué par rapport au XML fourni document:

<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> 

le résultat recherché, est produit correct:

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

Merci pour cette réponse. Malheureusement, il faut encore beaucoup de temps pour continuer, mon fichier XML contenant près de 90000 entrées. – Rob

+0

@Rob, Si la date de début est au début du document et que la date de fin se trouve à la fin du document, rien ne peut aider. La même chose dans le cas où les deux dates sont à la toute fin du document. Si les dates sont proches du début, cela devrait fonctionner rapidement. En outre, s'il est garanti que les dates de début et de fin sont égales aux dates dans le document, on peut utiliser XSLT et les clés - pour trouver l'entrée de début et l'entrée de fin - c'est O (1). S'il est garanti que l'accès à la séquence par position est O (1) (comme dans Saxon), on peut écrire une recherche binaire pour localiser l'entrée et la fin 'entry' –

0

Ok donc finalement je me suis rendu compte que let $entries := //entry[(xs:dateTime(./@date/string()) ge $dateBegin) and (xs:dateTime(./@date/string()) le $dateEnd)] fonctionne. Je me demande toujours si une meilleure solution existe bien.

0

Avez-vous un index de plage sur l'attribut entry/@ date défini pour la collection? Sinon je crois que cela accélérerait la requête.

Questions connexes