将MYSQL中多行时间戳之间的累计时间相加的最佳方法

将MYSQL中多行时间戳之间的累计时间相加的最佳方法,mysql,date,timestamp,Mysql,Date,Timestamp,我试图计算出用户在给定日期、昨天、本周(从周一开始)和本月登录的时间总和(以秒为单位) SELECT SUM( TIMESTAMPDIFF(SECOND,inDateTime, outDateTime ) ) AS minToday FROM time_log WHERE userID =".$id." AND YEAR(`inDateTime`) = YEAR(CURDATE()) AND MONTH(`inDateTime`) = MONTH(CURDATE(

我试图计算出用户在给定日期、昨天、本周(从周一开始)和本月登录的时间总和(以秒为单位)

    SELECT SUM( TIMESTAMPDIFF(SECOND,inDateTime, outDateTime ) ) AS minToday
    FROM time_log
    WHERE userID =".$id."
    AND YEAR(`inDateTime`) = YEAR(CURDATE()) AND MONTH(`inDateTime`) = MONTH(CURDATE()) 
    AND outDateTime !=  '0000-00-00 00:00:00'",true);
我在做一天和一周的事情时很幸运,但不是一个月

这是我的数据集:

| ID   | userID   | blank| inDateTime          | outDateTime         |
 --------------------------------------------------------------------
| 5451 |      134 |      | 2014-07-30 13:44:26 | 2014-07-31 03:11:03 |
| 5510 |      134 |      | 2014-07-31 12:18:15 | 2014-07-31 13:18:24 |
| 5526 |      134 |      | 2014-07-31 17:01:48 | 2014-08-01 02:45:54 |
| 5602 |      134 |      | 2014-08-01 23:34:12 | 2014-08-02 00:11:57 |
| 5613 |      134 |      | 2014-08-02 01:11:02 | 2014-08-02 04:46:02 |
| 5697 |      134 |      | 2014-08-03 16:31:07 | 2014-08-03 22:01:31 |
| 5712 |      134 |      | 2014-08-03 22:05:51 | 2014-08-03 22:07:15 |
| 5751 |      134 |      | 2014-08-04 13:42:41 | 2014-08-05 02:28:13 |
| 5807 |      134 |      | 2014-08-05 11:55:56 | 2014-08-06 02:09:18 |
| 5871 |      134 |      | 2014-08-06 12:00:00 | 2014-08-06 18:09:45 |
| 5911 |      134 |      | 2014-08-06 22:24:18 | 2014-08-07 02:12:53 |
| 6124 |      134 |      | 2014-08-10 14:32:56 | 2014-08-10 22:02:25 |
| 6153 |      134 |      | 2014-08-10 23:13:38 | 2014-08-10 23:24:55 |
| 6182 |      134 |      | 2014-08-11 12:53:57 | 2014-08-12 00:44:11 |
| 6230 |      134 |      | 2014-08-12 11:32:31 | 2014-08-12 19:06:25 |
| 6269 |      134 |      | 2014-08-13 00:41:27 | 2014-08-13 03:48:36 |
| 6303 |      134 |      | 2014-08-13 12:38:28 | 2014-08-14 02:00:22 |
| 6358 |      134 |      | 2014-08-14 11:50:09 | 2014-08-15 01:19:02 |
| 6418 |      134 |      | 2014-08-15 10:59:32 | 2014-08-15 15:07:35 |
| 6528 |      134 |      | 2014-08-17 13:07:48 | 2014-08-17 15:37:36 |
| 6543 |      134 |      | 2014-08-17 19:21:09 | 2014-08-18 00:31:00 |
| 6579 |      134 |      | 2014-08-18 10:53:36 | 2014-08-18 23:46:23 |
| 6662 |      134 |      | 2014-08-19 13:51:47 | 2014-08-20 01:00:13 |
| 6704 |      134 |      | 2014-08-20 10:18:07 | 2014-08-21 01:25:22 |
| 6788 |      134 |      | 2014-08-21 16:19:16 | 2014-08-22 01:03:32 |
| 6828 |      134 |      | 2014-08-22 10:23:35 | 2014-08-22 23:33:31 |
| 6952 |      134 |      | 2014-08-24 12:40:03 | 2014-08-24 18:56:43 |
| 6972 |      134 |      | 2014-08-24 20:23:40 | 2014-08-25 00:01:22 |
| 7061 |      134 |      | 2014-08-26 05:31:51 | 2014-08-26 05:42:59 |
| 7062 |      134 |      | 2014-08-26 06:08:16 | 2014-08-26 06:08:19 |
| 7067 |      134 |      | 2014-08-26 07:55:26 | 2014-08-26 07:55:28 |
| 7068 |      134 |      | 2014-08-26 07:55:32 | 2014-08-26 07:55:34 |
| 7069 |      134 |      | 2014-08-26 07:55:37 | 2014-08-26 07:55:40 |
| 7070 |      134 |      | 2014-08-26 07:55:50 | 2014-08-26 07:55:54 |
| 7071 |      134 |      | 2014-08-26 07:57:13 | 2014-08-26 07:57:15 |
| 7072 |      134 |      | 2014-08-26 07:57:47 | 2014-08-26 07:57:51 |
| 7073 |      134 |      | 2014-08-26 07:58:41 | 2014-08-26 07:58:44 |
当我用于今天的计算时:

SELECT SUM( outDateTime - inDateTime ) AS minToday
FROM time_log
WHERE userID =134
AND DATE(  `inDateTime` ) = DATE( NOW( ) ) 
AND outDateTime !=  '0000-00-00 00:00:00'
我得到了1131秒的正确答案

当我试着在一个月内使用:

SELECT SUM( outDateTime - inDateTime ) AS minToday
FROM time_log
WHERE userID =134
AND  `inDateTime` > DATE_SUB( NOW( ) , INTERVAL 1 
MONTH ) 
AND outDateTime !=  '0000-00-00 00:00:00'
我得到:84382713

超过2年半的秒数,不可能是正确的

为什么天数时间戳计算正确,而月份没有

我应该如何正确地查询此类数据


我修改了第二个查询,将total seconds作为正整数。我还修改了时间选择,只选择当前月份的天数

    SELECT SUM( TIMESTAMPDIFF(SECOND,inDateTime, outDateTime ) ) AS minToday
    FROM time_log
    WHERE userID =".$id."
    AND YEAR(`inDateTime`) = YEAR(CURDATE()) AND MONTH(`inDateTime`) = MONTH(CURDATE()) 
    AND outDateTime !=  '0000-00-00 00:00:00'",true);

你不能像你想做的那样直接去学数学。您要么必须转换为unix时间戳,以便在进行减法运算时有两个整数,要么使用timestampditt函数

SELECT SUM( UNIX_TIMESTAMP(outDateTime) - UNIX_TIMESTAMP(inDateTime) ) AS minToday
FROM time_log
WHERE userID =134
AND  `inDateTime` > DATE_SUB( NOW( ) , INTERVAL 1 
MONTH ) 
AND outDateTime !=  '0000-00-00 00:00:00'
或者你可以做一个:(首选)

并不是说您的字段名“minToday”对其中任何一个字段都不正确,因为第一个选项的结果是秒,第二个结果是本月的分钟

最后要检查的是您的where语句。 如果你做了一个

select * from time_log
WHERE userID =134
AND  `inDateTime` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
AND outDateTime !=  '0000-00-00 00:00:00'

您是否只获得了预期的行?

首先-改为使用BETWEEN。第二,测试服务器如何处理这两种情况。有时是包容的,有时不是。您必须实际执行测试输出以查看发生了什么。您的表中是否有坏数据
(inDateTime>now())
?没有时间戳大于今天的坏数据行。使用where语句,我将为该用户返回2014-07-27。这不是我真正想要的。我想要2014-08-01到当前日期。从当前日期算起不到30天左右。然后替换date_SUB(..),并查看例如