SQL 2008中XML持续时间元素的总和

时间:2010-03-24 20:10:51

标签: sql sql-server xml xquery

我有一个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秒。

以下是我目前使用的XML查询

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

我是XSLT / XPATH功能的新手:P

更新

movetime元素目前包含一个完整的持续时间;因此,如果玩家以1:1:23进行移动,那么它将保存为PT1H1M23S

虽然如果它更容易,但我确实有能力改变它,以便它只存储总秒数。

1 个答案:

答案 0 :(得分: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值求和,所以这就是我为dayTimeDuration添加了一个显式转换的原因。