Добавьте минуты в datetime в SQL SELECT из другого столбца - PullRequest
2 голосов
/ 08 мая 2020

У меня есть запрос SQL, который выбирает дату и время из базы данных. В другом столбце с названием «add_minutes» указаны минуты, которые я хочу добавить к дате и времени в запросе. Это должно выглядеть так:

SELECT * from availability WHERE ? < (datetime_start + add_minutes)

Есть подсказки, как решить эту проблему?

Спасибо!

1 Ответ

4 голосов
/ 08 мая 2020
SELECT * 
FROM availability 
WHERE ? < DATE_ADD(datetime_start, INTERVAL add_minutes MINUTE)

Также:

SELECT * 
FROM availability 
WHERE ? < ADDTIME(datetime_start, SEC_TO_TIME(add_minutes * 60))

Обратите внимание, что MySql тупой, и оба DATE_ADD() и ADDTIME() работают со строковыми выражениями. Из-за потенциальных проблем с локализацией / форматированием преобразование чисел в строки может оказаться на удивление дорогостоящей операцией, особенно если вам придется делать это для каждого столбца в таблице.

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

SELECT * 
FROM availability 
WHERE ADDTIME(?, SEC_TO_TIME(add_minutes * -60)) < datetime_start

Это инвертирует интервал и вместо этого добавляет его к исходному значению. Ему по-прежнему нужно просматривать каждое значение в столбце add_minutes, независимо от индекса, но теперь datetime_start не изменилось, и поэтому индексы в этом столбце все еще можно использовать.

Просто для удовольствия, вот как Sql Сервер делает это:

SELECT * 
FROM availability 
WHERE DATEADD(minute, add_minutes * -1, ?) < datetime_start

Sql Сервер менее тупой в отношении своей DATEADD() функции. Здесь все числовое; нет беспорядочных преобразований между строками и числами или датами. Sql Сервер также поддерживает вычисляемые столбцы с индексами. Таким образом, вы можете включить столбец в таблицу, обозначенный как DATEADD(minute, add_minutes, datetime_start), и иметь индекс для этого столбца. IIR C, MySql также поддерживает вычисляемые столбцы, но не поддерживает индексы для этих столбцов.

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