简体   繁体   中英

how to get sum of the total time in php

Currently i working with the attendance management system.i calculate how many hours work done in employees.i already calculate the how much hours working in day and it store in the mysql database.

$totaltime = (strtotime($time_out) - strtotime($time_in));

                $hours = sprintf('%02d', intval($totaltime / 3600));

                $seconds_remain = ($totaltime - ($hours * 3600)); 

                $minutes = sprintf('%02d', intval($seconds_remain / 60));   
                $seconds = sprintf('%02d' ,($seconds_remain - ($minutes * 60)));

                $final = '';

                if ($time_in == '' || $time_out == '')
                {
                    $final = '';
                }
                else
                {
                    $final .= $hours.':'.$minutes.':'.$seconds;
                }

for example

$time_in = 08:09:57
$time_out = 16:04:50
$final = 07:54:53 (total working hours)

now i want to get the current month total working time for each employee.how do get sum of the $final using php? sample data of the month_data

Emp_no  Date    Time_in Time_out    Total_hours TranID  
23  2019-08-01  07:54:40    16:01:40    08:07:00    1   
23  2019-08-02  07:42:35    16:02:53    08:20:18    2   

i want get the sum of the Total_hours for related one employee

If you ask me this can be easily done using plain MySQL, no meed for PHP to calculate this.

You could take a look at a query somewhat like this

SELECT SEC_TO_TIME(SUM(`Total_hours`) ) FROM `month_data` GROUP BY `Emp_no`;

there is a simple SUM function which can do this for you, it returns the total time in seconds though.

In order to turn that into readable time you can use the MySQL function SEC_TO_TIME .

edit

If the said column is not a TIME column you can CAST it to be handled as this type of column using CAST() the needed SQL would look something like

SELECT SEC_TO_TIME(SUM(CAST(`Total_hours` AS TIME)) ) FROM `month_data` GROUP BY `Emp_no`;

My suggestion would be to change the column type to TIME though.

edit 2

I was under the assumption that SUM() would be smart enough to convert the time to seconds and come up with the correct sum of the given times.

Not sure why yet but this is not the case, therefore you need to convert the given times to seconds first.

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(`Total_hours`)) ) FROM `month_data` GROUP BY `Emp_no`;

Now I have not tested this but TIME_TO_SEC() seems to accept VARCHAR just fine so need to CAST() the column anymore.

take a look at this:

echo OverallTime($allTimes);

$allTimes = array();
function OverallTime($allTimes) {
$minutes = 0;
foreach ($allTimes as $time) {
    list($hour, $minute) = explode(':', $time);
    $minutes += $hour * 60;
    $minutes += $minute;
}
$hours = floor($minutes / 60);
$minutes -= $hours * 60;

return sprintf('%02d:%02d', $hours, $minutes);
<?php
$total = [
    '00:02:55',
    '00:07:56',
    '01:03:32',
    '01:13:34',
    '02:13:44',
    '03:08:53',
    '03:13:54'
];

$sum = strtotime('00:00:00');
$sum2=0;
foreach ($total as $v){
    $sum1=strtotime($v)-$sum;
    $sum2 = $sum2+$sum1;
}
$sum3=$sum+$sum2;
echo date("H:i:s",$sum3);
?>

In case this is useful to someone looking for this, this is what I use on my music website. This code gets the duration in seconds of all the songs in an album, adds them up, and returns the total album length in hh mm ss.

$record_id = $this->record->id; <!--variable for record-->
.$query = 'SELECT SUM(duration) FROM #__songs WHERE `record_id` = '. $db->quote( (int) $record_id ); <!--selects the duration of all the songs in the album-->
$db->setQuery($query);  
$results = $db->loadResult();
echo gmdate("H:i:s", $results); <!--echo total time in hh mm ss.-->

Not an expert here. If you see something, say something XD

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM