Mysql 时差总计

Mysql 时差总计,mysql,sql,select,group-by,sum,Mysql,Sql,Select,Group By,Sum,我想得到结束时间和开始时间被组减去和求和后的加班总数 这是我的密码: $sql = "SELECT o.*, u.* ,p.* , SEC_TO_TIME(SUM(TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(dateto, '%m/%d/%y %H:%i'), '%Y-%m-%d %H:%i%s')) - TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i'), '%Y-%

我想得到
结束时间
开始时间
减去和求和后的加班总数

这是我的密码:

$sql = "SELECT o.*, u.* ,p.* ,
            SEC_TO_TIME(SUM(TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(dateto, '%m/%d/%y %H:%i'), '%Y-%m-%d %H:%i%s')) - TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i'), '%Y-%m-%d %H:%i%s')))) AS totalHrs,

            SEC_TO_TIME(SUM(TIME_TO_SEC(totalHrs))) AS grandTotal // Can't make this run
            FROM overtime AS o, users AS u, position AS p
            WHERE o.user_id=u.user_id and u.p_id=p.p_id
            GROUP BY p.p_id
            ORDER BY p.position_name ASC";
这是我的数据库:

|-----------|-------------|-------------|-----------------------|---------------------|
|-- ot_id --|-- user_id --|--- p_id ----|------ datefrom -------|------- dateto ------|
|-----------|-------------|-------------|-----------------------|---------------------|
|    1      |      3      |      17     |    12/17/15 17:00:00  |   12/17/15 19:00:00 |
|-----------|-------------|-------------|-----------------------|---------------------|
|    2      |      3      |      17     |    12/17/15 17:00:00  |   12/17/15 19:00:00 |
|-----------|-------------|-------------|-----------------------|---------------------|
|    3      |      10     |      27     |   12/17/15 17:00:00   |   12/17/15 19:00:00 |
|-----------|-------------|-------------|-----------------------|---------------------|
|    4      |      45     |      27     |    12/17/15 17:00:00  |   12/17/15 19:00:00 |
|-----------|-------------|-------------|-----------------------|---------------------|
|    5      |      44     |      5      |   12/17/15 17:00:00   |   12/17/15 19:00:00 |
|-----------|-------------|-------------|-----------------------|---------------------|
这是输出:

p_id #17 ----> Junior Programmer
     #27 ----> SAP Programmer
     #5 -----> Technician

|----------------------|--------------|
|------ position ------|-- Total Hrs--|
|----------------------|--------------|
|   Junior Programmer  |    4:00:00   |
|----------------------|--------------|
|    SAP Programmer    |    4:00:00   |
|----------------------|--------------|
|      Technician      |    2:00:00   |
|----------------------|--------------|
|       GRAND TOTAL    |   10:00:00   | <-------- CAN'T GET THIS
|----------------------|--------------|
p#id#17--->初级程序员
#27-->SAP程序员
#技术员
|----------------------|--------------|
|------职位------------------总工时--|
|----------------------|--------------|
|初级程序员| 4:00:00|
|----------------------|--------------|
|SAP程序员| 4:00:00|
|----------------------|--------------|
|技师| 2:00:00|
|----------------------|--------------|
|总计| 10:00:00 |使用函数获取任意列的累积和

试试这个:

SELECT IFNULL(p.position_name, 'Grand Total') AS `position`
       SEC_TO_TIME(SUM(TIME_TO_SEC(STR_TO_DATE(dateto, '%m/%d/%y %H:%i')) - TIME_TO_SEC(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i')))) AS totalHrs
FROM overtime AS o, users AS u, POSITION AS p
WHERE o.user_id=u.user_id AND u.p_id=p.p_id
GROUP BY p.p_id WITH ROLLUP
ORDER BY p.position_name ASC;

SELECT o.*, u.* ,p.* ,
       SEC_TO_TIME(SUM(TIME_TO_SEC(STR_TO_DATE(dateto, '%m/%d/%y %H:%i')) - TIME_TO_SEC(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i')))) AS totalHrs
FROM overtime AS o, users AS u, POSITION AS p
WHERE o.user_id=u.user_id AND u.p_id=p.p_id
GROUP BY p.p_id WITH ROLLUP
ORDER BY p.position_name ASC
您还可以使用函数生成两个日期的差值

SELECT IFNULL(p.position, 'Grand Total') AS `position`
        SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(datefrom, '%m/%d/%y %H:%i'),STR_TO_DATE(dateto, '%m/%d/%y %H:%i')))) AS totalHrs
FROM overtime AS o, users AS u, POSITION AS p
WHERE o.user_id=u.user_id AND u.p_id=p.p_id
GROUP BY p.p_id WITH ROLLUP
ORDER BY p.position_name ASC

SELECT o.*, u.* ,p.* ,
       SEC_TO_TIME(SUM(TIME_TO_SEC(STR_TO_DATE(dateto, '%m/%d/%y %H:%i')) - TIME_TO_SEC(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i')))) AS totalHrs
FROM overtime AS o, users AS u, POSITION AS p
WHERE o.user_id=u.user_id AND u.p_id=p.p_id
GROUP BY p.p_id WITH ROLLUP
ORDER BY p.position_name ASC

哦!!我的缺陷,我在代码中发现了错误

%H:%i:%s
是获取时间差和时间总和所必需的

我还忘了在
%H:%I%s
中包含

添加此行将得到总计:

(select SEC_TO_TIME(SUM(TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(dateto, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')) - TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')))) FROM overtime WHERE approve_by=0) AS grandTotal
最终代码为:

SELECT o.*, u.* ,p.* ,
            SEC_TO_TIME(SUM(TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(dateto, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')) - TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')))) AS totalHrs,

            (select SEC_TO_TIME(SUM(TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(dateto, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')) - TIME_TO_SEC(DATE_FORMAT(STR_TO_DATE(datefrom, '%m/%d/%y %H:%i:%s'), '%Y-%m-%d %H:%i:%s')))) FROM overtime) AS grandTotal

            FROM overtime AS o, users AS u, position AS p
            WHERE o.user_id=u.user_id and u.p_id=p.p_id and o.approve_by=0
            GROUP BY p.p_id
            ORDER BY p.position_name ASC

谢谢你的回复。我不知道发生了什么,但我无法让它工作。另外,我发现当
dateto=09:30:00和datefrom=08:00:00
时,小计将是
0
,而不是
01:30:00
@LekzFlores。您能否发布一些示例数据以了解问题所在,并允许我们解决您的问题。。。