0

私のテーブルには、mysqltime()形式でフォーマットされた列があります。 それが1つの値であるとき、私はそれを最も近い15分に再配置したい
というphp変数に割り当てます$preRemainOt

function roundTime($whatTime)
{

echo $whatTime."=>";

$roundTime= round ( strtotime($whatTime) / 60 * 15  );

echo date("H:i:s",$roundTime)."<br>";

return date("H:i:s",$roundTime);
}

    $validOt =roundTime($preRemainOt);

<pre>
few bad result given from my try as follow:
$preRemainOt=>$validO
    03:43:00=>06:55:45
    01:05:00=>06:16:15
    02:00:00=>06:30:00
but result shuld be as follow:
$preRemainOt=>$validO
    03:43:00=>03:45:00
    01:05:00=>01:00:00
    02:00:00=>02:00:00


1. アイデアをください。
2. 残りの ot value( $preRemainOt) が 24 時間を超え た場合に何が起こるかex:$preRemainOt='26:43:00'は、php または mysql 関数のいずれにも関係ありません。
このような ot 計算を格納するのに最適な mysql データ型は何ですか?

update1
いくつかのアドバイスの後、関数を 3 つのセクションに分けました

function secondToTime($timeStamp)
{
        $hours=intval($timeStamp / 3600);
        $mins=intval($timeStamp / 60) % 60;
        $secs=$timeStamp % 60;
    return sprintf("%d:%02d:%02d",$hours, $mins, $secs);
}

function timeToSecond($time='00:00:00')
{
    list($hours, $mins, $secs) = explode(':', $time);
    $timeToSecond = ($hours * 3600 ) + ($mins * 60 ) + $secs;

    return $timeToSecond;
}

function roundTime($interval='00:00:00')
{
    $interval=timeToSecond($interval);
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return secondToTime($interval);
}

列の値を$preRemainOt変数に代入する前に、さらにいくつかの手順があるため、そのような2つの手順も変更します。

function timeDiff($lastTime,$firstTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeDiff=$lastTime-$firstTime;

return secondToTime($timeDiff);
}

function timeAdd($firstTime,$lastTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeAdd=2*$lastTime-$firstTime;;
return secondToTime($timeAdd);
}

そのため、 select を使用するのは難しいと判断しましたUNIX_TIMESTAMP()。それは私のスクリプト全体を変更するでしょう。 この場合 "%d:%02d:%02d"、ナンセンスを与える

4

1 に答える 1

2

これを試して:

function roundTime($whatTime) {
    $time = strtotime($whatTime) + 450;
    return date("H:i:s", $time - $time % 900);
}

編集:

実際、以下のコメントに基づいて、これが私がすることです。これが時間間隔であり、文字通りの時点ではない場合、値を DATETIME 型ではなく整数の秒数としてデータベースに格納します。110249 秒は 30 時間 37 分 29 秒であるため、30:37:29 は 110249 として格納されます。

次に、この関数に「30:37:29」を渡す代わりに、110249 を過ぎます。関数は次のようになります。

function roundTime($interval) {
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return sprintf("%d:%02d:%02d",
        intval($interval / 3600),       // hours
        intval($interval / 60) % 60,    // minutes
        $interval % 60);                // seconds
}

すでにデータベースにたくさんのものを保存していて、それをDATETIMEの代わりに秒に絶対に変換できない場合は、クエリで、DATETIMEをクエリする代わりに、上記の関数とともにUNIX_TIMESTAMP関数を使用してください。つまり、これの代わりに:

SELECT id, name, preRemainOt, other_stuff...

これを行う:

SELECT id, name, UNIX_TIMESTAMP(preRemainOt) AS preRemainOt, other_stuff...

次に、DATETIME の値の代わりに、その列の整数値を roundTime 関数に渡します。

于 2012-12-28T07:48:18.747 に答える