2013-08-27 4 views
1

Я пытаюсь преобразовать десятичное время в фактический формат времени с часами и минутами, то есть: в xx: xx часов.mysql конвертировать десятичное время в 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.

+0

В каком формате указано десятичное время? Количество минут?Отметка? Datetime ?? – Gnudiff

+0

это часы.minutes так, например, 9:30 будет 9.5. Я хотел просто суммировать время, но все сказали мне, что это не лучшая идея, поэтому я перешел на десятичную. –

+0

Подводя итоги, что вы пытаетесь достичь? – vascowhite

ответ

0

Я думаю, что я рассчитал ваши значения времени ... хотя это была своего рода боль.

По-вашему, ваш "десятичный разряд" означает "hours.minutes"? Скорее ужасный и, безусловно, не очень хороший формат: для работы со временем лучше всего придерживаться целых чисел, которые определяют либо общее количество минут/секунд/часов, либо любую необходимую гранулярность.

Но если предположить, что это часы.минуты, вы должны быть в состоянии сделать это, как это в PHP:

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

Благодарю вас за помощь. Я отказался от этого. –

0

Надеюсь, я правильно предполагая, что вы имеете в виду, например, что 2,5 часа = 2H 30mins. Если это так, то ваше «время» является временным интервалом и лучше всего представлено классом 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: я» без их преобразования и от знаков после запятой, вы можете сделать это нравится: -

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

+0

так кажется, что у него большой потенциал, когда я помещал $ row ['vluchttijddec'] в echo decTimeToInterval ($ row ['vluchttijddec']) -> format ("% H:% I:% S"); Я получаю нечто совершенно отличное от того, что я ожидал. Я получаю 4:54, и это должно быть больше похоже на 512: 10 –

+0

Каково значение $ row ['vluchttijddec']? – vascowhite

+0

Что вы ожидаете увидеть, если ваше количество часов больше 24? – vascowhite

5

Вы можете сделать это в вас SQL заявления что-то вроде этого:

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

Где mydecimal вашего неотформатированного имя поля

+0

Удивительный! Отлично, мне удалось некоторое время. – ethree

3

Для всех, кто заинтересован ... Это, как вы бы преобразовать десятичное время (где 0,1 == 6 минут) до часов и минут (0.2333 == 14 минут) только в MYSQL. PHP не нужен. Это также объясняет необходимость округления секунд до минут.

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

Замените timeInDec на имя столбца, которое содержит десятичное время, которое вы хотели бы преобразовать.

Это вернет 0:06 за 0.1000 десятичное значение, так что ведущие нули учитываются в одну цифру минут.

+0

Это правильный ответ для любого приложения, использующего чисто mySQL. Просто замените переменную «timeInDec» на фактическую переменную или оператор, где вывод будет количеством часов в десятичном формате, и он будет работать. Я доказал это тремя разными способами, и это здорово. Спасибо ozfive. – eriknoyes

+0

Добро пожаловать! Рад помочь! – ozfive

Смежные вопросы