2010-08-12 16 views
1

Je suis aller chercher un datetime de MYSQL qui ressemble à:Arrondir un datetime MYSQL premier intervalle de 15 minutes en millisecondes (PHP)

2010-08-11 11:18:28

J'ai besoin de convertissez-le en "floor" ou au premier intervalle de 15 minutes et affichez en millisecondes une autre fonction.

Donc, ce cas serait:

2010-08-11 11:15:00 en millisecondes


Whoops! Désolé - besoin de clarifier - J'ai besoin de code qui va le transformer en millisecondes WITHIN php!


Faire un test de synchronisation révélé ce qui suit:

$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); 

temps pris = 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); 

temps pris = 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); 

temps pris = 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); 

temps pris = 20,687357902527

temps pris = 19,32729101181

temps pris = 19,938629150391

Il semble que la fonction strtotime() soit lente et nous devrions probablement éviter de l'utiliser doublement à chaque fois que cela est nécessaire. ! Le timeTaken (60 * 15) = timeTaken (900) était un peu une surprise ...

Répondre

1

Est-ce que ce travail? N'y a-t-il pas une fonction qui ferait mieux?

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 
0

Donner cette essayer et voir ce qui se passe:

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 
0

Ok, nous allons voir la pire solution :

<?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]); 
1

Ce qui suit vous donnera le plus tôt intervalle de 15 minutes:

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

le résultat est exprimé en secondes d'époque (s econds depuis '1970-01-01 00:00:00' UTC), si vous voulez cette valeur en millisecondes, vous devez multiplier par 1000 (soit dans la requête ou en PHP, comme bon vous semble).

EDIT

En PHP pour votre ensemble de valeurs qui serait:

$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"; 
} 

Lorsque vous multipliez $ résultat par 1000 (pour obtenir la valeur en ms), vous obtiendrez probablement un trop-plein et le résultat sera converti en un flotteur. Ceci est probablement pas ce que vous voulez, alors vous pourriez être mieux d'utiliser bcmul:

$result = bcmul((strtotime($value)-(strtotime($value) % 900)), 1000); 
+0

Hi! Cela semble rad pour mysql, y at-il une manière intelligente de faire la même chose en php? – DrMHC

+0

Bien sûr, voir mon édition. – wimvds