2012-10-23 56 views
2

我有一段时间生成一个报告,其中包含我的门票的创建日期。Trac sqlite日期查询

,这里是我的SQLite查询(我直接查询DB)

.header on 
.mode csv 
.output opentickets.csv 
SELECT DISTINCT 
    id AS ticket, summary, status, priority, t.type AS type, 
    owner, time as created 

    FROM ticket t, ticket_custom q 
    LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' 
    WHERE t.id = q.ticket AND status <> 'closed' 
ORDER BY priority, time; 

,但我得到了创作的时间值是垃圾: 我得到1341324096360000 时,我应该得到 2012-07 -03

我已经试过Unix纪元时间转换... 查询:

.header on 
.mode csv 
.output opentickets.csv 
SELECT DISTINCT 
    id AS ticket, summary, status, priority, t.type AS type, 
    owner, datetime(time, 'unixepoch') as created 

    FROM ticket t, ticket_custom q 
    LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' 
    WHERE t.id = q.ticket AND status <> 'closed' 
ORDER BY priority, time; 

我得到:-1413-03-01 13:07:12

我错过了什么?

回答

1

的Unix时间戳以秒,但它似乎这些值是微秒:

> SELECT datetime(1341324096360000/1000000, 'unixepoch'); 
2012-07-03 14:01:36 
5

CL是正确的,因为时间存储在微秒。你可以在schema这里看到,时间字段是一个int64,而在release notes中的这个意思是说,他们把时间从“epoch以来的秒数”改变为“epoch以来的微秒数”。

至于我在Trac查询中显示时间的经验,我不需要做任何转换。以下是我用来显示过去7天所有更改的故障单的查询。正如您所看到的,我将票证更改时间显示为select和Trac格式的一部分。 Trac会自动格式化创建,修改,日期,时间字段作为日期和/或时间。有关更多详细信息,请参见Trac wiki page

SELECT 
tc.Ticket AS ticket, 
tc.Time as time, 
c.value as __group__, 
ifnull(tc.Newvalue,0) as total, 
tc.Author AS author,   
tc.Field as field  
from ticket_change tc 
LEFT JOIN ticket t on t.id = tc.ticket 
LEFT JOIN ticket_custom c on c.ticket = tc.ticket and c.name= 'customer' 
LEFT JOIN ticket_custom tt on tt.ticket = tc.ticket and tt.name = 'totalhours' 
where field = 'hours' and c.Value is not null 
and tc.Time > strftime('%s',CURRENT_DATE-7) +0 
and tc.Time < strftime('%s',CURRENT_DATE) +0 
and tc.Author = $USER 
and tt.value is not null 

如果你正在寻找做一些特殊的fomatting,看看SQLite docs时间,但这里是一个简单的例子

strftime('%m/%d/%Y', time/1000000, 'unixepoch', 'localtime') 

我希望这有助于。