mysql将十进制时间转换为xx:xx格式

时间:2013-08-27 15:01:07

标签: php mysql time decimal

我正在尝试将小数时间转换为小时和分钟的实际时间格式,即:xx:xx小时。

我的查询是:

select SUM(vt.vluchtdec) AS vluchttijddecimal

from tbl_vluchtgegevens vg

left join tbl_vluchttijd vt
on vg.vluchttijddec = vt.vluchttijdID

WHERE vg.vertrekdatum <=NOW();

我正在回应

. $row['vluchttijddecimal'] .

我也试过这个,但这仍然以十进制格式给出了我的回答:

$result = mysql_query("select SUM(vt.vluchtdec) AS vluchttijddecimal

from tbl_vluchtgegevens vg

left join tbl_vluchttijd vt
on vg.vluchttijddec = vt.vluchttijdID

WHERE vg.vertrekdatum <=NOW();");

while($row = mysql_fetch_array($result))
{
$dec = $row['vluchttijddecimal'];
function 
convertTime($dec)
{
// start by converting to seconds
$seconds = $dec * 3600;
// we're given hours, so let's get those the easy way
$hours = floor($dec);
// since we've "calculated" hours, let's remove them from the seconds variable
$seconds -= $hours * 3600;
// calculate minutes left
$minutes = floor($seconds / 60);
// remove those from seconds as well
$seconds -= $minutes * 60;
// return the time formatted HH:MM:SS
return lz($hours).":".lz($minutes).":".lz($seconds);
}

// lz = leading zero
function lz($num)
{
return (strlen($num) < 2) ? "0{$num}" : $num;
}

echo "" .$dec."";

在MS Access中我会做这样的事情:

CInt([vluchttijddecimal]) & ":" & Format([vluchttijddecimal]*60 Mod 60;"00")

但这不起作用,或者我不知道如何在MySQL / php中这样做。

5 个答案:

答案 0 :(得分:5)

您可以在SQL语句中执行以下操作:

SELECT CONCAT(CEIL(mydecimal),':', LPAD(Floor(mydecimal*60 % 60),2,'0')) as formated text

mydecimal是未格式化的字段名称

答案 1 :(得分:3)

对于任何有兴趣的人......这就是你如何将MYSQL中的十进制时间(其中0.1 == 6分钟)转换为小时和分钟(0.2333 == 14分钟)。不需要PHP。这也说明需要将秒数转换为几分钟。

SELECT CONCAT(FLOOR(timeInDec),':', LPAD(ROUND((timeInDec - FLOOR(timeInDec)) * 60) % 60,2,0)) AS TimeInHoursMinutes
FROM YourTable;

将timeInDec替换为包含您要转换的小数时间的列名。

对于0.1000十进制值,这将返回0:06,因此前导零以单位数分钟计算。

答案 2 :(得分:0)

我想我已经计算了你的时间价值......虽然这有点痛苦。

看来你的“十进制时间”是“hours.minutes”?相当可怕,绝对不是一个好的格式:处理时间最好坚持整数,指定总分钟/秒/小时或您需要的任何粒度。

但假设它是小时。分钟,你应该能够在PHP中这样做:

while($row = mysql_fetch_array($result))
{
$dec = $row['vluchttijddecimal'];
return sprintf("%2d:%2d", floor($dec), floor(($dec - floor($dec))*100));
}

答案 3 :(得分:0)

希望我认为你的意思是正确的,例如2.5小时= 2小时30分钟。如果是这样,那么您的'时间'是一个时间间隔,最好由DateInterval类表示。

此功能可以满足您的需求: -

/**
 * Converts a 'decimal time' in the format 1.5hours to DateInterval object
 * 
 * @param Int $decimalTime
 * @return DateInterval
 */
function decTimeToInterval($decimalTime)
{
    $hours = floor($decimalTime);
    $decimalTime -= $hours;
    $minutes = floor($decimalTime * 60);
    $decimalTime -= ($minutes/60);
    $seconds = floor($decimalTime * 3600);

    $interval = new \DateInterval("PT{$hours}H{$minutes}M{$seconds}S");
    return $interval;
}

echo decTimeToInterval(512.168)->format("%H:%I:%S");

See it working

如果您想以“H:i”格式添加时间而不将它们转换为小数,请执行以下操作: -

function sumTimes($time1, $time2)
{
    list($hours1, $minutes1) = explode(':', $time1);
    list($hours2, $minutes2) = explode(':', $time2);
    $totalHours = $hours1 + $hours2;
    $totalMinutes = $minutes1 + $minutes2;
    if($totalMinutes >= 60){
        $hoursInMins = floor($totalMinutes/60);
        $totalHours += $hoursInMins;
        $totalMinutes -= ($hoursInMins * 60);
    }
    return "$totalHours:$totalMinutes";
}

echo sumTimes('12:54', '100:06') . PHP_EOL;
echo sumTimes('12:54', '100:20') . PHP_EOL;

See it working

答案 4 :(得分:0)

这是我用于薪资系统的内容:

SELECT If(total_late>0, LPAD(CONCAT(REPLACE(FLOOR(total_late/60) + FORMAT(total_late%60*0.01,2), '.', ':'), ':00'), 8, 0), '00:00:00') FROM MyTable

我将其乘以0.01,因为我的变量以秒为单位。例如。 60.00 = 1分钟