MySQL 通过 group By 和排除查找平均 Timediff

标签 mysql

我有一个 MySQL 表,其中包含两个日期时间列:

CREATE TABLE test (job_id int, dateCol1 DATETIME, datecol2 DATETIME);

它包含一系列表示作业开始和结束时间的数据。我需要知道这些作业的平均持续时间(以分钟为单位),但到目前为止还不知道如何实现它。

我尝试过各种方法:

SELECT job_id, AVG(TIMEDIFF(datecol2,datecol1)) FROM test GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIMEDIFF(datecol2,datecol1))) FROM test  GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIME_TO_SEC(datecol2)-TIME_TO_SEC(datecol1))) FROM test GROUP BY job_id;
SELECT job_id, SEC_TO_TIME(AVG(TIME_TO_SEC(FROM_UNIXTIME(UNIX_TIMESTAMP(datecol2)-UNIX_TIMESTAMP(datecol1))))) FROM test GROUP BY job_id;;

我将其与我打印出来并在 Excel 中平均的所有作业列表进行比较,但到目前为止我得到了不同的结果。

作为补充,我还需要排除任何持续时间超过 1 小时的内容。

我确信我只是把这个问题复杂化了,如果有人能告诉我如何实现,我将不胜感激,否则我最终将不得不打印出每个作业的列表,并在 Excel 中手动对它们进行平均。

最佳答案

您可以使用UNIX_TIMESTAMP得到秒差,然后得到平均值。

SELECT job_id, 
       SEC_TO_TIME(AVG(UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1))) 
FROM test 
GROUP BY job_id;

如果您需要过滤那些差异大于一小时的内容...

SELECT job_id, 
       SEC_TO_TIME(AVG(UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1))) 
FROM test 
WHERE  UNIX_TIMESTAMP(datecol2) - UNIX_TIMESTAMP(datecol1) < 3600 
GROUP BY job_id;

Br

关于MySQL 通过 group By 和排除查找平均 Timediff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18383207/

相关文章:

mysql - 当 order by 与 where 子句不同时,有什么方法可以避免文件排序?

mysql - SQL 过程 CREATE Table with variable Tablename

php - 向数据库发送日期查询

php - 切换到 PDO 后,Password_Verify 总是返回 false?

mysql - 为什么 POINT() 被存储为 ??*??E@z?3M??Q?在 mysql 表中

mysql 字符串到日期的转换

android - 在 Termux Android 上连接到 MariaDB 服务器

php - MySQL 准备好的查询是否为每 session 一次的查询提供性能优势?

python - 从 Django 管理 UI 调用 Python 脚本(在字段值更改时)

php - 选择、插入 MySQL 和 PHP