如果匹配,SQLite 减去两个表之间的时间差

标签 sqlite time match

我需要一些有关 SQLite 查询的帮助。我有两个表,一个名为“生产”的表和一个名为“暂停”的表:

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 |
+------------+-------------+------------+----------+

第二个表还包含日期和开始时间和结束时间。因此,让我们假设,“暂停”表如下所示:
+------------+------------+----------+
|    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 进行这种计算,但最终我认为让数据库进行计算会更好。也许你们中的某个人可以给我一个关于如何解决这个问题的提示。我尝试了不同的查询,但结果总是出乎我的意料。

最佳答案

要将时间字符串转换为秒数,请使用 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

关于如果匹配,SQLite 减去两个表之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065846/

相关文章:

iphone - SQLite-时间戳

java - 我试图在 java 中的 sqlite 嵌入式数据库中插入一行。插入后,更改仅在该程序中可见

ruby-on-rails - rails 中的错误 : 'incompatible library version' sqlite3-1. 3.11

php - 500 内部错误 - 连接到外部 WordPress 数据库时 PHP 超时

excel - 使用公式在动态变化的范围内返回匹配单元格的值?

Android - 无法打开 [SQL] 数据库错误

从不完整的字符串解析 golang 时间对象

ruby-on-rails - 使用 .created_at 作为日期引用获取天数/周数

excel - 对于一列中的每个单元格,检查下一列中的多个匹配项,然后突出显示它们

rust - 为什么 Rust 的示例猜谜游戏允许具有不同返回类型的 match 语句?