2010-03-24 53 views
2

我有一個保存關於我的遊戲信息的XML列。以下是一些信息樣例。SQL2008中XML持續時間元素的總和

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

我想設計一個XML查詢來取我的movetime元素的總和。基本上我需要每個球員移動時間的總和。因此,使用上面的示例,PlayerA的總移動時間爲5秒,而PlayerB的總移動時間爲3秒。

這裏的,我一直在目前一直使用

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

我是一個新手,以XSLT/XPATH功能的XML查詢:P

UPDATE

的movetime元素目前包含完整的持續時間;所以如果玩家採取1:1:23進行移動,那麼它將保存爲PT1H1M23S

儘管如果它更容易,我確實有能力改變它,以便它只存儲總秒數。

+0

有趣的問題!請澄清''可以包含完整的「持續時間」語法,還是僅包含秒(這會更簡單)。 – Tomalak 2010-03-24 20:28:18

+0

對不起,我已經更新了這個問題來澄清。 – Matt 2010-03-24 21:08:04

回答

0

我不知道這是否適用於SQL服務器,但一個簡單的查詢的PlayerAs移動返回總和:

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

需要注意的是XS:使用dayTimeDuration被稱爲XDT:dayTimeDuration;我不確定哪個版本的SQL服務器使用。

XQuery將只允許您總結xs:dayTimeDuration和xs:yearMonthDuration值,所以這就是爲什麼我添加了明確的cast到dayTimeDuration。

+0

原來,SQL Server不喜歡最後的xs:datTimeDuration(。)函數,但+1幫助我!至少我可以使用SQL選擇所有玩家的時間。我只需在C#中編寫一個函數來解析並添加時間。 謝謝! – Matt 2010-03-29 15:40:40