Actualización:creo que https://stackoverflow.com/a/21330407/480943 es una mejor respuesta.
Puedes hacerlo con alguna aritmética de fechas:
SELECT some_columns,
DATE_ADD(
DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00"),
INTERVAL IF(MINUTE(the_date) < 30, 0, 1) HOUR
) AS the_rounded_date
FROM your_table
Explicaciones:
-
DATE_FORMAT :
DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")
devuelve la fecha truncada a la hora más cercana (establece las partes de minutos y segundos en cero). -
MINUTO :
MINUTE(the_date)
obtiene el valor de los minutos de la fecha. -
SI :Este es un condicional; si el valor del parámetro 1 es verdadero, devuelve el parámetro 2; de lo contrario, devuelve el parámetro 3. Entonces,
IF(MINUTE(the_date) < 30, 0, 1)
significa "Si el valor de los minutos es inferior a 30, devuelve 0; de lo contrario, devuelve 1". Esto es lo que vamos a usar para redondear:es la cantidad de horas para volver a agregar. -
DATE_ADD :Esto suma el número de horas de la ronda al resultado.