2009-02-25 8 views
3

Je souhaite créer un rapport répertoriant tous les tickets qui ont été fermés pendant une certaine période.Comment créer un rapport avec des tickets fermés à une certaine date dans Trac

Le pseudo-code serait comme

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

La partie que je ne parviens pas à résoudre est date_closed = 'january 2009'.

Existe-t-il un moyen de le faire dans Trac?

Je ne suis pas intéressé par une syntaxe SQL particulière, je peux écrire les contraintes de temps moi-même. Ce dont je ne suis pas certain, c'est la structure db de Trac.

Répondre

2
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'; 

Si vous connaissez aussi l'année, au lieu de strftime vous feriez mieux d'utiliser une expression comme suggéré de 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') 
+5

Il semble que la version 0.12 soit passée à l'utilisation de microsecondes dans les champs de temps. Vous devrez utiliser '((ticket_change.time/1000000)' pour convertir correctement avec unixepoch. – dwj

3
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 */ 

Si vous voulez un mois spécifique:

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') est le premier jour du mois donné par date et date('2009-01-01','start of month','+1 month','-1 day') est le dernier jour du mois.

+0

La dernière modification peut concerner autre chose que le statut. – kmkaplan

+0

Bon point kmkaplan. Cependant dans mon cas, je suis intéressé par les tickets qui sont fermés en ce moment, donc "closed" est toujours le dernier changement. En tous cas. Les deux m'a beaucoup aidé. Merci beaucoup. –

+0

@JS: même dans ce cas vous pouvez changer le ticket, donc son changetime, quand il est fermé. – kmkaplan

0

En outre, en ce qui concerne la structure de la table, là, vous allez:

CREATE TABLE ticket_change ( 
    ticket INTEGER, 
    time  INTEGER, 
    author TEXT, 
    field TEXT, 
    oldvalue TEXT, 
    newvalue TEXT, 
    UNIQUE (ticket, time, field) 
); 
Questions connexes