Как создать отчет с заявками, закрытыми на определенную дату в Trac

Я хочу создать отчет, в котором будут перечислены все заявки, которые были закрыты за определенный период времени.

Псевдокод будет похож на

SELECT * FROM tickets
WHERE closed AND date_closed = 'january 2009'

Часть, которую я не могу решить, это date_closed = 'january 2009'.

Есть ли способ сделать это в Trac?

Меня не интересует конкретный синтаксис SQL, я могу сам написать временные ограничения. В чем я не уверен, так это в структуре базы данных Trac.


person Josef Sábl    schedule 25.02.2009    source источник


Ответы (3)


SELECT DISTINCT ticket.* FROM ticket, ticket_change
 WHERE ticket.id = ticket_change.ticket
   AND ticket_change.field = 'status'
   AND ticket_change.newvalue = 'closed'
   AND strftime('%m', ticket_change.time, 'unixepoch') = '01';

Если вы также знаете год, вместо strftime вам лучше использовать выражение, подобное предложенному vartec:

SELECT DISTINCT ticket.* FROM ticket, ticket_change
 WHERE ticket.id = ticket_change.ticket
   AND ticket_change.field = 'status'
   AND ticket_change.newvalue = 'closed'
   AND date(ticket_change.time,'unixepoch') 
       BETWEEN date('2009-01-01','start of month') 
           AND date('2009-01-01','start of month','+1 month','-1 day')
person kmkaplan    schedule 25.02.2009
comment
Похоже, что версия 0.12 перешла на использование микросекунд в полях времени. Вам нужно будет использовать (ticket_change.time/1000000) для правильного преобразования с unixepoch. - person dwj; 28.07.2011

SELECT * FROM ticket
WHERE status='closed' 
  AND date(changetime,'unixepoch') 
      BETWEEN date('YYYY-MM-DD') /* <- here goes your start date */
          AND date('YYYY-MM-DD') /* <- here goes your end date */

Если вам нужен конкретный месяц:

SELECT * FROM ticket
WHERE status='closed' 
  AND date(changetime,'unixepoch') 
      BETWEEN date('2009-01-01','start of month') 
          AND date('2009-01-01','start of month','+1 month','-1 day') 

Где date('2009-01-01','start of month') — первый день месяца, заданный датой, а date('2009-01-01','start of month','+1 month','-1 day') — последний день месяца.

person vartec    schedule 25.02.2009
comment
Последнее изменение может быть связано с чем-то другим, кроме статуса. - person kmkaplan; 25.02.2009
comment
Хороший вопрос кмкаплан. Однако в моем случае меня интересуют билеты, которые в данный момент закрыты, поэтому закрытое всегда является последним изменением. Так или иначе. Оба ваши мне очень помогли. Большое спасибо. - person Josef Sábl; 25.02.2009
comment
@JS: даже в этом случае вы можете изменить билет, то есть время его изменения, когда он закрыт. - person kmkaplan; 25.02.2009

Кроме того, что касается структуры таблицы, вот вам:

CREATE TABLE ticket_change ( 
    ticket   INTEGER,
    time     INTEGER,
    author   TEXT,
    field    TEXT,
    oldvalue TEXT,
    newvalue TEXT,
    UNIQUE ( ticket, time, field ) 
);
person dnk.nitro    schedule 04.04.2011