1

我在 SQLfiddle 中编辑了一个 mysql 表:在此处输入链接描述

正如您在那里看到的,我想添加一个列来计算时间列和 NOW() 之间的差异(以小时为单位),但没有任何效果。

有什么提示吗?

4

2 回答 2

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 演示

输出:

|     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 |
于 2013-06-21T12:04:37.233 回答
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
于 2013-06-21T12:16:24.127 回答