Округление MySQL датирует до ближайшего интервала, не будучи затронутым изменениями Летнего времени - PullRequest
0 голосов
/ 04 декабря 2018
SET @time := '2018-11-08 00:36:50.000000';
SET @intervalInMinutes := 15
SELECT FROM_UNIXTIME((Select FLOOR ((select UNIX_TIMESTAMP(@time) / (@intervalInMinutes* 60))) * (@intervalInMinutes*60)));

Мне нужно написать запрос в MySQL, который преобразует дату / время в категорию ближайшего интервала, указанную пользователем.Примеры:

  • Например, 1: '2018-10-24 17: 45: 50,000000'

    1. Для интервала в 15 минут будет переводиться в '2018-10-24 17:45:00 '
    2. Для интервала в 30 минут будет переводиться в' 2018-10-24 17:30:00 '
    3. Для интервала в 60 минут будет переводитьсядо '2018-10-24 17: 00: 00'
  • Например, 2: '2018-10-24 17: 36: 20.000000';

    1. Для интервала в 15 минут будет переводиться в '2018-10-24 17: 30: 00'
    2. Для интервала в 30 минут будет переводиться в '2018-10-24 17:30:00'
    3. Для интервала 60 минут будет переводиться в' 2018-10-24 17: 00: 00 '

Я написал вышеупомянутый запрос, которыйКажется, работает нормально.Тем не менее, если перейти к этой записи , то в первом ответе будет комментарий, в котором говорится, что этот подход потерпит неудачу, когда даты и время переходят на летнее время .Я не понимаю пример, который он указывает.Другие подходы, которые я заметил в этой теме, выглядят еще более сложными для моего случая.Я пытаюсь понять, как это повлияет на мой сценарий.Любые предложения / примеры приветствуются. Или есть лучший способ избежать этого, написав более простой запрос?PS Я хочу, чтобы это было применимо к MySQL 5.6,5.7 и 8.0.

1 Ответ

0 голосов
/ 04 декабря 2018

Проблема, с которой вы можете столкнуться при использовании преобразования даты и времени в unixtime и обратно, вполне нормальная , объясненная в базе данных MySQL .

Чтобы быть в безопасности, я бы использовал другой подход:

SET @time := '2018-11-08 00:36:50.000000';
SET @intervalInMinutes := 15;
SELECT TIMESTAMP(DATE(@time), SEC_TO_TIME(FLOOR(TIME_TO_SEC(TIME(@time)) / (@intervalInMinutes * 60)) * (@intervalInMinutes * 60)));

Идея очень похожа: вы переводите время в секунды, округляете и возвращаете обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...