Atualização:acho que https://stackoverflow.com/a/21330407/480943 é uma resposta melhor.
Você pode fazer isso com alguma aritmética de data:
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
Explicações:
-
DATE_FORMAT :DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")
retorna a data truncada para a hora mais próxima (configura as partes de minuto e segundo para zero).
-
MINUTE :MINUTE(the_date)
obtém o valor minuto da data.
-
SE :Esta é uma condicional; se o valor no parâmetro 1 for verdadeiro, ele retornará o parâmetro 2, caso contrário, retornará o parâmetro 3. EntãoIF(MINUTE(the_date) < 30, 0, 1)
significa "Se o valor do minuto for menor que 30, retorne 0, caso contrário, retorne 1". Isso é o que vamos usar para arredondar -- é o número de horas para adicionar novamente.
-
DATE_ADD :Isso adiciona o número de horas da rodada ao resultado.