SQL lite查询中的Trac-WHERE语句对于所有元组都是“false”,尽管它不应该是

时间:2012-07-03 12:59:48

标签: sql sqlite trac

Trac中的以下SQL Lite语句

  SELECT 
  id,
  changetime / 1000000 as 'MODIFIED',
  strftime('%s',"now") as 'NOW',
  ((strftime('%s',"now")) - (changetime / 1000000)) as 'DIFF'
  FROM ticket
  WHERE (CAST(((strftime('%s',"now")) - (changetime / 1000000)) AS NUMERIC) < 86400.0)

得出以下结果:

enter image description here

“changetime”是Trac的一个字段(类型:int64)。我想要达到的是选择所有更改时间在一周内的门票。我遇到了很多问题,因为changetime是int64而strftime返回的是不同的东西。这就是我除以1000000的原因。

现在我遇到的问题是WHERE语句总是假的,因为你可以在屏幕截图中看到我有它适用的票据(临时删除WHERE子句后的截图)。

有人知道出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

SELECT
  id,
  changetime as modified,
  strftime('%s',"now") as date,
  (strftime('%s',"now") - changetime / 1000000) as 'DIFF'
FROM ticket
WHERE (CAST(strftime('%s',"now") AS NUMERIC) - changetime / 1000000) < 86400.0

有效(在Trac 0.11上用分频器1而不是1.000.000进行测试),因为你必须在进行计算之前进行类型转换 - 不能用strftime的日期字符串计算

请注意,某些特殊列名称(“已创建”,“已修改”,“日期”,“时间”)会触发自动格式设置为日期和/或时间。 TicketQuery在这方面效果更好,因为您可以将时间限制更自然地指定为changetime=1w..now,但是您可以在TracReports域中隐含地询问解决方案。

答案 1 :(得分:0)

我在Trac中有一个报告,它获取了过去7天内已更改的故障单,我使用以下SQL处理where子句。

from ticket_change tc 
where tc.Time > strftime('%s',CURRENT_DATE-7) +0
and tc.Time < strftime('%s',CURRENT_DATE) +0