如何使用JQL或ScriptRunner对比Jira父子问题的解决日期
基于Adaptavist ScriptRunner筛选「解决日期晚于父问题完成时间」子任务实现方案
方法1:直接用增强JQL快速筛选(推荐,适合日常搜索场景)
安装ScriptRunner后可直接在高级搜索页运行以下JQL,适配ScriptRunner 6.0及以上版本:
type = Sub-task AND resolution is not empty AND parent is not null AND resolutiondate > parent.resolutiondate
如果你的ScriptRunner版本不支持直接引用父级字段属性,切换到ScriptRunner自带的Script JQL功能页,粘贴以下Groovy脚本直接执行即可得到结果:
import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.web.bean.PagerFilter def searchService = ComponentAccessor.getComponent(com.atlassian.jira.bc.issue.search.SearchService) def jqlParser = ComponentAccessor.getComponent(com.atlassian.jira.jql.parser.JqlQueryParser) def loggedInUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser // 拉取基础范围:所有已解决、存在父级的子任务 def baseQuery = jqlParser.parseQuery("type = Sub-task AND resolution is not empty AND parent is not null") def searchResult = searchService.search(loggedInUser, baseQuery, PagerFilter.getUnlimitedFilter()) def validSubtaskKeys = [] searchResult.results.each { subtask -> def parent = subtask.parentObject // 跳过父级未解决、无有效解决日期的条目 if (!parent.resolutionDate) return // 统一转毫秒时间戳对比,规避时区、日期格式导致的判断误差 if (subtask.resolutionDate.time > parent.resolutionDate.time) { validSubtaskKeys << subtask.key } } // 返回匹配的子任务列表 return validSubtaskKeys
常见实现失败原因排查
- 日期对比逻辑错误:不要把日期转成字符串做对比,必须取
Date对象的time属性(毫秒级时间戳)做数值对比,否则会因时区、日期格式不统一出现判断偏差 - 缺少空值校验:未解决的Issue没有
resolutiondate字段值,直接调用字段属性会触发空指针,导致脚本/查询中断,必须先判断字段非空再做对比 - 字段映射错误:如果你的父问题「完成时间」是自定义字段而非系统默认的
resolutiondate,需要替换对应取值逻辑:先通过自定义字段ID拿到字段对象,再调用getCustomFieldValue()方法取值后对比
扩展:子任务解决时实时校验
如果需要在子任务流转到「已解决」状态时做拦截提示,可以给子任务工作流的解决步骤添加ScriptRunner脚本校验器,脚本如下:
import com.opensymphony.workflow.InvalidInputException def parentIssue = issue.parentObject // 父问题未解决时直接放行 if (!parentIssue?.resolutionDate) return true // 子任务解决日期晚于父问题时拦截 if (issue.resolutionDate.time > parentIssue.resolutionDate.time) { throw new InvalidInputException("子任务解决日期不能晚于父问题的解决日期,请核对日期后重新提交") } return true
内容的提问来源于stack exchange,提问作者DamnitDawn
相关产品推荐
相关产品推荐

