我在SQLfiddle中编辑了一个mysql表:enter link description here
正如你在那里看到的那样,我想在几小时内添加一个用于计算时间列和NOW()之间差异的列,但没有任何效果。
任何提示?
答案 0 :(得分: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;
<强>输出:强>
| 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 |
答案 1 :(得分: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