первое решение soul усекается вместо округления, а второе решение не работает с такими случаями перехода на летнее время, как:
select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));
Вот альтернативный метод (1):
DATE_ADD(
tick,
INTERVAL (IF((MINUTE(tick)*60)+SECOND(tick) < 1800, 0, 3600) - (MINUTE(tick)*60)+SECOND(tick)) SECOND
)
Если вам не нужно беспокоиться о секундах, вы можете упростить это следующим образом (2):
DATE_ADD(
tick,
INTERVAL (IF(MINUTE(tick) < 30, 0, 60) - MINUTE(tick)) MINUTE
)
Или, если вы предпочитаете усекать вместо раунда, вот более простая версия метода души (3):
DATE_SUB(tick, INTERVAL MINUTE(tick)*60+SECOND(tick) SECOND)
РЕДАКТИРОВАТЬ: Я профилировал некоторые из этих запросов на своем локальном компьютере и обнаружил, что для 100 000 строк среднее время было следующим:
- Soul's
UNIXTIME
метод: 0,0423 мс (быстро, но не работает с DST)
- Мой метод 3: 0,1255 мс
- Мой метод 2: 0,1289 мс
- Метод Бена Ли
DATE_FORMAT
: 0,1495 мс
- Мой метод 1: 0,1506 мс