Trac查询显示过期日期的票证

时间:2013-04-26 16:50:01

标签: sql trac

SELECT id AS ticket, status, priority, reporter, owner, 
       time AS created, summary
  FROM ticket
  WHERE status IN ('new', 'assigned', 'reopened') and reporter = $USER
  ORDER BY time, priority

我试图让记者看到他们过去的到期门票,这些门票目前已经开放,但我是trac的新手。任何使用当前日期的帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

完成你需要的任务

  • 设置自定义故障单字段due_date或类似字段(可能已在您的情况下完成)
  • 在Trac db table ticket_custom上使用JOIN来获取字段值
  • 检索当前日期(时间戳)
  • 转换due_date和当前日期(可能两者)中的至少一个以进行比较

我会在这里跳过1 + 2,因为StackOverflow上有现有的文档(即参见How to show due date column in the trac reports?)和其他地方。

获取 NOW():根据authoritative wiki documentation报告,Trac报告只有一个动态分配的变量:$ USER。所以你需要使用SQL函数。我找不到便携式解决方案,因此这些建议取决于您的数据库后端:

  • SQLite(Trac默认值):current_datedatetime('now','localtime')
  • PostgreSQL:current_timestampnow()

在最后一个子任务上:可能你还没有使用真正的自定义时间字段,因为它是Trac 1.1.1以来的支持,因为它是一个开发快照版本,并且仍然接近前沿。我只是指出它的完整性,因为它将为您节省使用字符串转换解决方法的麻烦,如下所述。

您现在可能使用的是一个字符串,可能是DateFieldPlugin提供的改进输入法。但是,在SQL语句中直接比较字符串值最初是无用的。您必须将所有字符串转换为日期值或整数才能使报表正常工作。请参阅How to create report with tickets closed at certain date in Trac,因为它与时间戳转换有关。我建议使用本机Trac时间列格式(整数值),这取决于您的Trac版本:

  • Trac< = 0.11:POSIX秒
  • Trac> = 0.12:POSIX micro -seconds

但是已发布的示例主张在SQL语句中使用date函数(对于SQLite)。根据您的日期字符串格式,这需要将字符串转换为适当的格式,即使用sample report for DateFieldPlugin中显示的substr

将各个部分放在一起(例如,对于SQLite,假设MM/DD/YYYY为due_date字符串格式):

SELECT id AS ticket, status, priority, reporter, owner, 
       time AS created, summary, tc.value as date
  FROM ticket t
LEFT JOIN ticket_custom tc on t.id = tc.ticket and tc.name= 'due_date'
  WHERE status IN ('new', 'assigned', 'reopened') and reporter = $USER
       and date(substr(tc.value,7,4)||"-"||substr(tc.value,1,2)||"-"||substr(tc.value,4,2)) < current_date
  ORDER BY time, priority

答案 1 :(得分:0)

自己想出来并忘记了这篇文章,但为了完成起见,我将发布我的查询。

SELECT p.value AS __color__, id AS ticket, status, owner, c1.value AS company,
       time AS created,  c.value AS target_date, summary, p.value as Priority
  FROM ticket t 
  LEFT JOIN enum p ON p.name = t.priority
  LEFT JOIN ticket_custom c ON t.id=c.ticket AND c.name='target_date'
  LEFT JOIN ticket_custom c1 ON t.id=c1.ticket AND c1.name='company'
  WHERE status IN ('new', 'assigned', 'reopened') and reporter= $USER and CURRENT_DATE > target_date
  ORDER BY target_date