SELECT
DAYOFYEAR(`birthday`) - DAYOFYEAR(CURDATE()) + CASE
WHEN DAYOFYEAR(`birthday`) < DAYOFYEAR(CURDATE()) THEN 365
ELSE 0
END AS rn, users.*
FROM users
WHERE (DAYOFYEAR(`birthday`) - DAYOFYEAR(CURDATE()) + CASE
WHEN DAYOFYEAR(`birthday`) < DAYOFYEAR(CURDATE()) THEN 365
ELSE 0
END < 30)
ORDER BY rn
LIMIT 100;
Напишите детерминированную функцию от двух параметров
CREATE FUNCTION sf_date_diff(
in_date1 DATE,
in_date2 DATE
)
RETURNS INTEGER
DETERMINISTIC
BEGIN
DECLARE var_day1 INTEGER;
DECLARE var_day2 INTEGER;
DECLARE var_res INTEGER;
SET var_day1 = DAYOFYEAR(in_date1);
SET var_day2 = DAYOFYEAR(in_date2);
SET var_res = var_day1 - var_day2;
IF (var_res < 0) THEN
SET var_res = var_res + 365;
END IF;
RETURN var_res;
END;
И вызовите ее в запросе
SELECT
sf_date_diff(`birthday`, CURDATE()) AS rn,
users.*
FROM
users
WHERE
sf_date_diff(`birthday`, CURDATE()) < 30
ORDER BY rn
LIMIT 100;
За счет детерминированности вызов функции будет происходить только для разных входных параметров
А еще можно через подзапросы
SELECT
*
FROM
(
SELECT
DAYOFYEAR(`birthday`) - DAYOFYEAR(CURDATE()) + CASE
WHEN DAYOFYEAR(`birthday`) < DAYOFYEAR(CURDATE()) THEN 365
ELSE 0
END AS rn, users.*
FROM users
) sub
WHERE sub.rn < 30
ORDER BY sub.rn
LIMIT 100;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
запутался я в джойнахПрошу помощи)) Короче, есть таблицы products и categories