2013-06-21 19 views
1

我在SQLfiddle這裏編輯的MySQL表之間的列:enter link description here的MySQL小時的時差加2個日期

正如你可以看到那裏,我想增加一列計算bewtween時間列的差異,NOW ()幾小時,但沒有什麼效果。

任何提示?

+0

將轉換日期以UNIX時間戳,進行計算,並通過3600除以結果給你什麼你需要? – 2013-06-21 11:55:38

回答

1

試試這個:

SELECT * ,HOUR(TIMEDIFF(STR_TO_DATE(Arbeitsbeginn, '%d.%m.%Y %H:%i:%s'), NOW())) 
FROM (SELECT DRIVERNAME, GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsbeginn', DATETIME, NULL)) AS 'Arbeitsbeginn', 
      GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsende', DATETIME, NULL)) AS 'Arbeitsende', 
      GROUP_CONCAT(IF(ACTIONTEXT = 'PB', DATETIME, NULL)) AS 'Projektbeginn' 
     FROM geoImportRoot 
     GROUP BY DRIVERNAME 
    ) A; 

入住這SQL Fiddle Demo

輸出:

|  DRIVERNAME |  ARBEITSBEGINN | ARBEITSENDE |  PROJEKTBEGINN | HOUR(TIMEDIFF(STR_TO_DATE(ARBEITSBEGINN, '%D.%M.%Y %H:%I:%S'), NOW())) | 
----------------------------------------------------------------------------------------------------------------------------------------------------- 
| Marx, Ronald | 18.06.2013 06:32:09 |  (null) | 18.06.2013 06:32:12 |                  77 | 
| Richter, Mario | 18.06.2013 06:42:06 |  (null) | 18.06.2013 06:42:09 |                  77 | 
| Winkler, Mario | 18.06.2013 06:48:22 |  (null) |    (null) |                  77 | 
+0

這工作完美! –

1

首先,你可能是最明智的您的時間戳存儲DATETIME格式,而不是文本。如果您以文本形式(如「2013-06-18 14:32:09」)指定時間戳,那麼MySQL將自動理解它們並將它們轉換爲DATETIME對象。

如果你這樣做,你可以索引你的DATETIME字段。當您的系統中有一百萬個運輸工作時,這將幫助您保持應用程序的性能。

其次,功能TIMESTAMPDIFF(HOUR, NOW(), timestamp)將產生整數小時。您可能希望使用(1.0/3600.0) * TIMESTAMPDIFF(SECOND, NOW(), timestamp)來代替小數小時。

第三,您在sqlfiddle中呈現的摘要查詢的完整性取決於每個工作人員在數據庫中只有一個作業。一旦杜林里克特駕駛不止一次,他將有一個Arbeitsbeginn結果看起來是這樣的:

18.06.2013 06:42:06,19.06.2013 06:27:48 
+0

好吧,這是正確的問題。我有這個新的小提琴http://sqlfiddle.com/#!2/44487/7顯示問題。任何建議如何我可以解決這個問題? –

+0

您正在嘗試所謂的pivot操作,因爲您將信息從日誌表的行轉移到結果集的列中。您需要弄清楚爲每個特定任務關聯Artbeitsbeginn,Arbeitsende和PB日誌條目的明確方式。我恭敬地建議你爲這個新主題開始一個新的SO問題。 –

+0

完成。謝謝 –