separar - Redondeando un datetime de MYSQL al primer intervalo de 15 minutos en milisegundos(PHP)
obtener solo la hora de un datetime mysql (4)
Ok, veamos la peor solución:
<?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]);
Estoy buscando una fecha de MYSQL que se parece a:
2010-08-11 11:18:28
Necesito convertirlo en el "piso" o el primer intervalo de 15 minutos y la salida en milisegundos para otra función.
Entonces, este caso sería:
2010-08-11 11:15:00 en milisegundos
¡Ups! Lo siento, necesito aclararlo, necesito un código que lo transforme en milisegundos DENTRO de php.
Hacer una prueba de tiempo reveló lo siguiente:
$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);
tiempo tomado = 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);
tiempo tomado = 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);
tiempo tomado = 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);
tiempo tomado = 20.687357902527
tiempo empleado = 19.32729101181
tiempo tomado = 19.938629150391
Parece que la función strtotime () es lenta y probablemente deberíamos evitar usarla doblemente cada vez que sea necesario. El timetaken (60 * 15)! = Timetaken (900) fue un poco sorprendente ...
Pruébalo y mira lo que sucede:
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
¿Esto funcionaría? ¿No hay alguna función que lo haría mejor?
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
Lo siguiente le dará el primer intervalo de 15 minutos:
select UNIX_TIMESTAMP(YOURDATETIME)-MOD(UNIX_TIMESTAMP(YOURDATETIME), 900)
from YOURTABLE
El resultado es en segundos de época (segundos desde ''1970-01-01 00:00:00'' UTC), si quiere ese valor en milisegundos, debe multiplicar por 1000 (ya sea en la consulta o en PHP, como mejor le parezca) .
EDITAR
En PHP para su conjunto de valores que sería:
$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";
}
Cuando multiplica $ resultado por 1000 (para obtener el valor en ms) probablemente obtenga un desbordamiento y el resultado se convertirá en un flotante. Probablemente esto no sea lo que quieres, por lo que es mejor que uses bcmul :
$result = bcmul((strtotime($value)-(strtotime($value) % 900)), 1000);