我有一张卡控制入口门的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
答案 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)
计算当前记录之前的所有记录,并返回-1
或1
。
JULIANDAY(time)
以数字数量转换时间字符串。前两个结果的产品将返回所需的计算(以天为单位)。
TIME(1721059.5+...)
将返回格式正确的时间字符串。由于1721059.5
定义且SQLite date/time functions仅对JULIANDAY
之后的日期有效,因此需要0000-01-01 00:00:00
。
编辑:看看@CL答案,我发现使用JULIANDAY('00:00')
比1721059.5
更优雅。但是,我保持不变,因为它应该比使用函数调用更好。