我需要一些SQLite查询的帮助。我有两个表,一个名为'production'的表和一个名为'pause'的表:
CREATE TABLE production (
date TEXT,
item TEXT,
begin TEXT,
end TEXT
);
CREATE TABLE pause (
date TEXT,
begin TEXT,
end TEXT
);
对于生成的每个项目,创建表格生成中具有当前日期,开始时间和结束时间的条目(两个时间戳格式为HH:MM:SS)。我们假设,生产表看起来像:
+------------+-------------+------------+----------+
| date | item | begin | end |
+------------+-------------+------------+----------+
| 2013-07-31 | Item 1 | 06:18:00 | 08:03:05 |
| 2013-08-01 | Item 2 | 06:00:03 | 10:10:10 |
| 2013-08-01 | Item 1 | 10:30:15 | 14:20:13 |
| 2013-08-01 | Item 1 | 15:00:10 | 16:00:00 |
| 2013-08-02 | Item 3 | 08:50:00 | 15:00:00 |
+------------+-------------+------------+----------+
第二个表还包含日期,开始和结束时间。所以我们假设,'pause'表格如下:
+------------+------------+----------+
| date | begin | end |
+------------+------------+----------+
| 2013-08-01 | 08:00:00 | 08:30:00 |
| 2013-08-01 | 12:00:00 | 13:30:00 |
| 2013-08-02 | 10:00:00 | 10:30:00 |
| 2013-08-02 | 13:00:00 | 14:00:00 |
+------------+------------+----------+
现在我想得到一张表,其中包含每件商品的生产开始和结束时间之间的时差。如果“暂停”表中有匹配的条目,则应减去暂停时间。
基本上,最终结果应如下所示:
+------------+------------+-------------------------------------------------+
| date | Item | time difference (in seconds), excluding pause |
+------------+------------+-------------------------------------------------+
| 2013-07-31 | Item 1 | 6305 |
| 2013-08-01 | Item 1 | 12005 |
| 2013-08-01 | Item 2 | 13207 |
| 2013-08-02 | Item 3 | 16800 |
+------------+------------+-------------------------------------------------+
我不太确定,我怎么能用SQLite来完成它。我知道可以用Python进行这种计算,但最后我认为让数据库进行计算会更好。也许你们中的某个人可以给我一个如何解决这个问题的提示。我尝试了不同的查询,但总是得到与我预期不同的结果。
答案 0 :(得分:2)
要将时间字符串转换为秒数,请使用strftime function和%s
修饰符。
(假定没有日期部分的时间字符串具有日期2000-01-01
,但在计算差异时会取消。)
要计算特定production
记录的暂停时间,请使用相关子查询;需要total聚合来处理零/一/多匹配暂停。
SELECT date,
item,
sum(strftime('%s', end) - strftime('%s', begin) -
(SELECT total(strftime('%s', end) - strftime('%s', begin))
FROM pause
WHERE pause.date = production.date
AND pause.begin >= production.begin
AND pause.end <= production.end)
) AS seconds
FROM production
GROUP BY date,
item
答案 1 :(得分:0)
我找到的最佳答案是:
SELECT
cast(
(
strftime('%s',time_arrived)-strftime('%s',time_departed)
) AS real
)/60/60 AS elapsed
FROM date AS t;
有关附加信息,请查看此blog article。