2 Stimmen

Summe der XML-Dauerelemente in SQL2008

Ich habe eine XML-Spalte, die Informationen über meine Spiele enthält. Hier ist ein Beispiel für die Informationen, wie sie aussehen.

<game xmlns="http://my.name.space" >
<move>
    <player>PlayerA</player>
    <start movetype="Move">EE5</start>
    <end movetype="Move">DF6</end>
    <movetime>PT1S</movetime>
</move>
<move>
    <player>PlayerB</player>
    <start movetype="Move">CG7</start>
    <end movetype="Move">DE6</end>
    <movetime>PT3S</movetime>
</move>
<move>
    <player>PlayerA</player>
    <start movetype="Move">FD3</start>
    <end movetype="Move">EG8</end>
    <movetime>PT4S</movetime>
</move>
</game>

Ich versuche, eine XML-Abfrage zu entwerfen, um die Summe meiner movetime-Elemente zu ermitteln. Grundsätzlich benötige ich die Summe der Bewegungszeit jedes Spielers. Mit dem obigen Beispiel hätte SpielerA eine Gesamtbewegungszeit von 5 Sekunden und SpielerB eine Gesamtbewegungszeit von 3 Sekunden.

Hier ist die XML-Abfrage, mit der ich derzeit gearbeitet habe

SELECT GameHistory.query('declare default element namespace "http://my.name.space"; data(/game/move/movetime)') AS Value FROM GamesWHERE Id=560

Ich bin ein Neuling in Sachen XSLT / XPATH-Funktionen :P

UPDATE

Das Movetime-Element enthält derzeit eine vollständige Dauer; wenn der Spieler also 1:1:23 für eine Bewegung benötigt, wird sie als PT1H1M23S gespeichert.

Aber wenn es einfacher ist, kann ich das so ändern, dass nur die Gesamtsekunden gespeichert werden.

0voto

Oliver Hallam Punkte 4202

Ich bin nicht sicher, ob dies in SQL Server funktioniert, aber eine einfache Abfrage, um die Summe der PlayerAs Züge zurückzugeben, ist:

declare default element namespace "http://my.name.space";
sum(/game/move[player="PlayerA"]/movetime/xs:dayTimeDuration(.))

Beachten Sie, dass xs:dayTimeDuration früher xdt:dayTimeDuration hieß; ich bin nicht sicher, welche Version SQL Server verwendet.

XQuery erlaubt es nur, xs:dayTimeDuration- und xs:yearMonthDuration-Werte zu summieren, weshalb ich einen expliziten Cast auf dayTimeDuration hinzugefügt habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X