Uppdatering:Jag tror att https://stackoverflow.com/a/21330407/480943 är ett bättre svar.
Du kan göra det med lite datumaritmetik:
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
Förklaringar:
-
DATE_FORMAT :
DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")
returnerar datumet avkortat till närmaste timme (ställer in minut- och sekunddelarna till noll). -
MINUT :
MINUTE(the_date)
får datumets minutvärde. -
IF :Detta är en villkorlig; om värdet i parameter 1 är sant returnerar det parameter 2, annars returnerar det parameter 3. Så
IF(MINUTE(the_date) < 30, 0, 1)
betyder "Om minutvärdet är mindre än 30, returnera 0, annars returnera 1". Det här är vad vi ska använda för att avrunda -- det är antalet timmar att lägga till igen. -
DATE_ADD :Detta lägger till antalet timmar för omgången i resultatet.