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 также поддерживает вычисляемые столбцы, но не поддерживает индексы для этих столбцов.