获得配对时差的总和

时间:2013-10-15 23:51:09

标签: sql sqlite

我有一张卡控制入口门的sqlite表。

我需要偶数奇数时间间隔的总和,所以例如卡02的预期总和是(12:03 - 08:07)+(16:03 - 14:52)= 03:56 + 01 :21 = 05:07

人们可以在白天自由移动,因此可能会有很多卡片条目。

Test table

表格如下:

card_id | time
----------------------------
   03   | 07:55
   01   | 08:02
   02   | 08:07
   03   | 11:56
   02   | 12:03
   03   | 12:23
   02   | 14:52
   03   | 15:56
   01   | 15:58
   02   | 16:03

3 个答案:

答案 0 :(得分:1)

我没有SQLite可以尝试这个,但是这样的事情应该有效:

CREATE TEMP TABLE card_times AS
SELECT time FROM entries
WHERE card_id = 2;

SELECT SUM(strftime("%s", '2000-01-01 ' || x.time || ':00') 
         - strftime("%s", '2000-01-01 ' || y.time || ':00')) 
FROM card_times AS x INNER JOIN card_times AS y
ON x.ROWID = y.ROWID + 1  
WHERE (x.ROWID % 2) = 0

获取所需卡片的时间表。使用行ID匹配自己,以匹配正确的对。过滤掉奇数对。总结结果。

注意如果时钟换到第二天,这将失败。在SQLite中处理这种情况会很难看。您确实需要原始数据中的完整日期时间。

这会在几秒钟内给出答案。我让你找出如何以你需要的单位获得它。

答案 1 :(得分:1)

可以动态地计算哪些时间是偶数和奇数,但如果我们将这些信息放入表格本身就更容易:

ALTER TABLE MyTable ADD odd;

UPDATE MyTable
SET odd = (SELECT COUNT(*) % 2
           FROM MyTable AS c
           WHERE c.card_id = MyTable.card_id
             AND c.time    < MyTable.time);

然后可以简单地将每张卡的时间相加,将值乘以-1均匀。 (因为结果是时间差异,所以需要添加julianday('00:00')才能返回绝对时间值。)

SELECT card_id,
       (SELECT TIME(SUM(julianday(time) * CASE odd WHEN 0 THEN -1 ELSE 1 END)
                    + julianday('00:00'))
        FROM MyTable
        WHERE card_id = cards.card_id
       ) AS total_time
FROM (SELECT DISTINCT card_id
      FROM MyTable) AS cards;

03|07:34:00
01|07:56:00
02|05:07:00

答案 2 :(得分:1)

查询并不难,但时间间隔处理是!

SELECT card_id,
    TIME(1721059.5+SUM(JULIANDAY(time)*((SELECT COUNT() FROM t AS _ WHERE card_id=t.card_id AND time<t.time)%2*2-1)))
FROM t
GROUP BY card_id;

工作原理:

((SELECT COUNT() FROM t AS _ WHERE card_id=t.card_id AND time<t.time)%2*2-1)计算当前记录之前的所有记录,并返回-11

JULIANDAY(time)以数字数量转换时间字符串。前两个结果的产品将返回所需的计算(以天为单位)。

TIME(1721059.5+...)将返回格式正确的时间字符串。由于1721059.5定义且SQLite date/time functions仅对JULIANDAY之后的日期有效,因此需要0000-01-01 00:00:00

编辑:看看@CL答案,我发现使用JULIANDAY('00:00')1721059.5更优雅。但是,我保持不变,因为它应该比使用函数调用更好。