You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TFS 2015:如何用SQL追踪看板子列的周期时间?

解决TFS 2015中追踪看板子列到状态的周期时间问题

我完全懂你的困扰——WORKITEMHISTORYVIEW确实不会追踪看板子列的变更,因为这个视图只聚焦于工作项的系统字段变更(比如状态、优先级这类内置字段),而看板的列/子列属于TFS看板的自定义板配置,它们的变更历史存在专门的表中。下面我会一步步教你用SQL实现需求:

关键表说明

首先你需要用到TFS_M3WAREHOUSE库下的这几个核心表:

  • WorkItemDim:存储工作项的基础信息(ID、标题、迭代关联等)
  • WorkItemBoardHistory:记录每个工作项在看板上的列/子列变更历史,包含BoardColumn(父列)、BoardSubColumn(子列)、ChangedDate(变更时间)字段
  • WorkItemHistory:记录工作项的状态变更历史,用来追踪进入Verified状态的时间
  • IterationDim:用来筛选目标迭代的工作项
  • DateDim:可选,用来更精准地计算工作日(排除周末/节假日)

完整SQL查询示例

下面的查询会找出指定迭代中,工作项从进入Development列的Doing子列,到状态变为Verified的耗时(以天为单位)。你可以根据自己的看板配置调整参数:

USE TFS_M3WAREHOUSE;
GO

WITH DoingEntry AS (
    -- 获取工作项进入Doing子列的时间
    SELECT
        wibh.WorkItemSK,
        MIN(wibh.ChangedDate) AS DoingEntryDate
    FROM WorkItemBoardHistory wibh
    JOIN WorkItemDim wid ON wibh.WorkItemSK = wid.WorkItemSK
    JOIN IterationDim itd ON wid.IterationSK = itd.IterationSK
    WHERE
        -- 替换为你的目标迭代名称
        itd.IterationName = '你的迭代名称'
        -- 替换为看板父列名称
        AND wibh.BoardColumn = 'Development'
        -- 替换为看板子列名称
        AND wibh.BoardSubColumn = 'Doing'
    GROUP BY wibh.WorkItemSK
),
VerifiedEntry AS (
    -- 获取工作项进入Verified状态的时间
    SELECT
        wih.WorkItemSK,
        MIN(wih.ChangedDate) AS VerifiedEntryDate
    FROM WorkItemHistory wih
    JOIN WorkItemDim wid ON wih.WorkItemSK = wid.WorkItemSK
    JOIN IterationDim itd ON wid.IterationSK = itd.IterationSK
    WHERE
        itd.IterationName = '你的迭代名称'
        -- 替换为目标状态名称
        AND wih.NewValue = 'Verified'
        -- 确保是状态字段的变更
        AND wih.FieldName = 'System.State'
    GROUP BY wih.WorkItemSK
)
-- 关联两个时间点,计算周期时间
SELECT
    wid.WorkItemID AS 工作项ID,
    wid.Title AS 工作项标题,
    de.DoingEntryDate AS 进入Doing时间,
    ve.VerifiedEntryDate AS 进入Verified时间,
    DATEDIFF(DAY, de.DoingEntryDate, ve.VerifiedEntryDate) AS 周期时间(天)
FROM WorkItemDim wid
JOIN DoingEntry de ON wid.WorkItemSK = de.WorkItemSK
JOIN VerifiedEntry ve ON wid.WorkItemSK = ve.WorkItemSK
JOIN IterationDim itd ON wid.IterationSK = itd.IterationSK
WHERE
    itd.IterationName = '你的迭代名称'
    -- 排除时间异常的记录(比如Verified时间早于Doing时间)
    AND ve.VerifiedEntryDate >= de.DoingEntryDate
ORDER BY 周期时间(天) DESC;

调整说明

  • 如果你的Verified是看板列而非系统状态,只需要把VerifiedEntry部分的逻辑改成从WorkItemBoardHistory中筛选对应的列/子列即可。
  • 如果需要计算工作日而非自然日,可以关联DateDim表,统计两个日期之间的工作日数量(DateDim中有IsWorkingDay字段)。
  • 若要查看更详细的变更历史,可以加入WorkItemBoardHistory中的ChangedBy字段,追踪是谁操作的变更。

常见问题排查

  1. 找不到WorkItemBoardHistory表?
    TFS 2015的数据仓库默认存在这个表,如果没找到,可能是仓库未完成最新同步。可以手动触发TFS仓库的同步作业,或者检查仓库配置。
  2. 子列名称不匹配?
    看板子列名称区分大小写,你可以先运行SELECT DISTINCT BoardSubColumn FROM WorkItemBoardHistory WHERE BoardColumn = 'Development'确认准确的子列名称。

内容的提问来源于stack exchange,提问作者Britt Wescott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:30