sqlite3 unixtime interval通过乘法和除法查询

时间:2014-10-22 17:41:11

标签: sql sqlite

我一直在尝试为我的sqlite3数据库创建一个查询,它在最长和最短时间之间以10分钟为间隔向我提供所有记录的计数。

我在互联网上找到了这个答案,似乎有效:

select (((`unixtime`)/600000)*600000) as timeslice, 
count(*) as mycount from mytable 
where 
`unixtime` >= 1413902772599 
and 
`unixtime` <= 1413972793000 
group by timeslice;

我得到的结果是这样的:

timeslice      mycount   
-------------  ----------
1413930000000  9         
1413930600000  1013      
1413931200000  265       
1413932400000  410       
1413933000000  643      

这似乎是一种执行此查询的hackish方式。它也没有包含零计数的数据点,这是一个边缘情况,我将不得不在数据库范围之外修复(除非有一个SQL解决方案)。

还有更好的方法吗?如果我继续使用此查询,是否存在边缘情况?在我不考虑的某些情况下,这会灾难性地失败吗?

1 个答案:

答案 0 :(得分:0)

没有更好的方法来舍入600000的倍数; SQLite有round() function,但你仍然需要转换为可以舍入到某个小数部分的值。

如果您使用的是SQLite 3.8.3或更高版本,则可以使用recursive common table expression生成间隔:

WITH RECURSIVE intervals(t) AS (
    VALUES(1413902400000)
    UNION ALL
    SELECT t + 600000
    FROM intervals
    WHERE t < 1413972000000
)
SELECT intervals.t,
       COUNT(*)
FROM intervals
LEFT JOIN MyTable
    ON MyTable.unixtime BETWEEN intervals.t
                            AND intervals.t + 599999
GROUP BY 1;