2013-08-05 26 views
2

我需要一些SQLite查詢幫助。我有兩個表,一個名爲「生產」表和表叫「暫停」:如果匹配,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進行這種計算,但最終我認爲讓數據庫執行計算會更好。也許你的某個人可以給我提示如何解決這個問題。我嘗試了不同的查詢,但我總是以不同於我預期的結果結束。

+0

「匹配」是什麼意思?開始/結束時間可以暫停嗎? –

+0

對不起,我忘了提及。理論上,這應該是不可能的。一點背景:我有一臺機器,通常人們都在工作。在午休期間,機器繼續生產該產品。 (但是,只能通過用戶輸入啓動或完成一個項目。)現在,每個人每天在每個項目上工作的時間有多長。所以我需要從機器的整個工作間隔中減去暫停間隔。 – user2494129

回答

2

要將時間字符串轉換爲秒數,請使用strftime function%s修飾符。 (沒有日期部分A的時間字符串將被假定爲具有日期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 
+0

在早餐期間,我有了解決這個問題的想法,即用兩個子和一個連接。它工作,但你的解決方案更好,更快。感謝您的好解釋! – user2494129

0

最好的答案,我發現是:

SELECT 
    cast(
     (
      strftime('%s',time_arrived)-strftime('%s',time_departed) 
     ) AS real 
    )/60/60 AS elapsed 
FROM date AS t; 

對於aditional的信息,請查看本blog article