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字段,追踪是谁操作的变更。
常见问题排查
- 找不到
WorkItemBoardHistory表?
TFS 2015的数据仓库默认存在这个表,如果没找到,可能是仓库未完成最新同步。可以手动触发TFS仓库的同步作业,或者检查仓库配置。 - 子列名称不匹配?
看板子列名称区分大小写,你可以先运行SELECT DISTINCT BoardSubColumn FROM WorkItemBoardHistory WHERE BoardColumn = 'Development'确认准确的子列名称。
内容的提问来源于stack exchange,提问作者Britt Wescott
相关产品推荐
相关产品推荐

