1

我有一张卡控制入口门使用情况的 sqlite 表。

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

人们在白天可以自由活动,所以一张卡可以有很多条目。

测试台

该表如下所示:

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
4

3 回答 3

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 中处理这种情况会很丑陋。您确实需要原始数据中的完整日期时间。

这会在几秒钟内给出答案。我让你弄清楚如何在你需要的单位中得到它。

于 2013-10-16T01:11:02.273 回答
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
于 2013-10-16T07:25:43.867 回答
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)计算当前记录之前的所有记录并返回-1or 1

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

TIME(1721059.5+...)将返回格式正确的时间字符串。1721059.5是必需的,因为JULIANDAY定义和SQLite 日期/时间函数仅对 . 之后的日期有效0000-01-01 00:00:00

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

于 2013-10-16T09:32:10.240 回答