2

次のような MYSQL から日時を取得しています。

2010-08-11 11:18:28

それを「フロア」または最も早い 15 分間隔に変換し、別の機能のためにミリ秒単位で出力する必要があります。

したがって、このケースは次のようになります。

2010-08-11 11:15:00 (ミリ秒)


おっと!申し訳ありません-明確にする必要があります-php内でミリ秒に変換するコードが必要です!


タイミング テストを実行すると、次のことが明らかになりました。

$time_start = microtime(true);
for($i=0;$i<10000;$i++)
    floor(strtotime('2010-08-11 23:59:59')/(60*15))*60*15*1000;
$time_end = microtime(true);
echo 'time taken = '.($time_end - $time_start);

かかった時間 = 21.440743207932

$time_start = microtime(true);
for($i=0;$i<10000;$i++)
    strtotime('2010-08-11 23:59:59')-(strtotime('2010-08-11 23:59:59') % 900);
$time_end = microtime(true);
echo 'time taken = '.($time_end - $time_start);

かかった時間 = 39.597450017929

$time_start = microtime(true);
for($i=0;$i<10000;$i++)
    bcmul((strtotime('2010-08-11 23:59:59')-(strtotime('2010-08-11 23:59:59') % 900)), 1000);
$time_end = microtime(true);
echo 'time taken = '.($time_end - $time_start);

かかった時間 = 42.297260046005

$time_start = microtime(true);
for($i=0;$i<10000;$i++)
    floor(strtotime('2010-08-11 23:59:59')/(900))*900000;
$time_end = microtime(true);
echo 'time taken = '.($time_end - $time_start);

かかった時間 = 20.687357902527

かかった時間 = 19.32729101181

かかった時間 = 19.938629150391

strtotime() 関数は遅いようで、必要なたびに二重に使用することはおそらく避けるべきです。timetaken(60*15) != timetaken(900) はちょっとした驚きでした...

4

4 に答える 4

1

以下は、最も早い 15 分間隔を示します。

select UNIX_TIMESTAMP(YOURDATETIME)-MOD(UNIX_TIMESTAMP(YOURDATETIME), 900) 
from YOURTABLE

結果はエポック秒 ('1970-01-01 00:00:00' UTC からの秒数) です。その値をミリ秒単位で表示する場合は、1000 を掛ける必要があります (クエリまたは PHP のいずれかで適切と思われる場合)。 .

編集

値のセットのPHPでは、次のようになります。

$values = array('2010-08-11 11:18:28', '2010-08-11 11:28:28', '2010-08-11 00:00:00', '2010-08-11 23:59:59');
foreach($values as $value) {
    $result = (strtotime($value)-(strtotime($value) % 900));
    echo "$value -> $result\n";
}

$result に 1000 を掛けると (値をミリ秒で取得するため)、おそらくオーバーフローが発生し、結果が float に変換されます。これはおそらくあなたが望むものではないので、 bcmulを使用する方が良いかもしれません:

$result = bcmul((strtotime($value)-(strtotime($value) % 900)), 1000);
于 2010-08-12T13:54:18.080 に答える
1

これは機能しますか?これをより良くする機能はありませんか?

echo floor(strtotime('2010-08-11 11:18:28')/(60*15))*60*15*1000;
1281505500000
Wednesday, August 11, 2010 11:15:00 AM

echo floor(strtotime('2010-08-11 11:28:28')/(60*15))*60*15*1000;
1281505500000
Wednesday, August 11, 2010 11:15:00 AM

echo floor(strtotime('2010-08-11 00:00:00')/(60*15))*60*15*1000;
1281465000000
Wednesday, August 11, 2010 12:00:00 AM

echo floor(strtotime('2010-08-11 23:59:59')/(60*15))*60*15*1000;
1281550500000
Wednesday, August 11, 2010 11:45:00 PM
于 2010-08-13T01:36:20.427 に答える
0

では、最悪の解決策を見てみましょう。

<?php

$ts    = explode(' ', '2010-08-11 11:18:28');
$date  = explode('-', $ts[0]);
$time  = explode(':', $ts[1]);
$ts    = mktime($time[0], $time[1], $time[2], $date[1], $date[2], $date[0]);
$floor = mktime($time[0], round($time[1]/15)*15, 0, $date[1], $date[2], $date[0]);
于 2010-08-12T13:45:33.493 に答える
0

これを試してみて、何が起こるか見てみましょう:

select DATE(myColumn) 
       + CONVERT(HOUR(myColumn),CHAR(2)) + ':'
       + CASE 
         WHEN MINUTE(myColumn) < 15 THEN '00'
         WHEN MINUTE(myColumn) < 30 THEN '15'
         WHEN MINUTE(myColumn) < 45 THEN '30'
         ELSE '45'
       END 
       + ':00' as myDate
于 2010-08-12T13:43:02.473 に答える