2010-03-24 56 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