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。您能否发布一些示例数据以了解问题所在,并允许我们解决您的问题。。。