solo separar obtener hora fecha extraer campo php mysql datetime time floor

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