В таблице хранятся события оплаты:
CREATE TABLE table_paid (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`paid_at` int(11) NOT NULL COMMENT 'unix timestamp',
`days` smallint(6) NOT NULL COMMENT 'paid days',
)
id записи, timestamp оплаты и число оплаченных дней. (Для упрощения убрал user_id)
Сейчас задача решается вне БД, в коде - туда выгружаются все оплаты пользователя, в цикле перебираются, суммируются накладывающиеся оплаченные периоды и включается/выключается флаг оплаченности.
Как вместо внешнего кода, только средствами MySQL получить, закончился ли на сейчас оплаченный период?
Громоздкий вариант - с временной таблицей. Туда занести timestamp'ы и +1 для события оплаты, -1 для окончания этого периода оплаты. Далее отсортировать по датам, завести переменную и суммировать её значение, проходя по строкам. Ещё не придумал, как при наложении нескольких оплаченных интервалов перенести избыток на ближайшее окончание оплаты.