isActive, т.к. данное поле каждый раз придётся обновлять при обращении к акциям
SELECT * FROM special WHERE date_end > NOW()
UNION
SELECT * FROM special WHERE date_end < NOW()
DATE(NOW()) <= date_end AS isActive
CASE TRUE
WHEN date_end >= DATE_ADD(NOW(), INTERVAL 1 WEEK))
AND date_end < DATE_ADD(NOW(), INTERVAL 1 MONTH)) THEN "через месяц"
WHEN date_end >= DATE_ADD(NOW(), INTERVAL 1 DAY))
AND date_end < DATE_ADD(NOW(), INTERVAL 1 WEEK)) THEN "через неделю"
...
END AS kogda
и подобными