Ваш метод не будет работать по нескольким причинам. Возможно, проще всего объяснить это:
Для каждого пользователя получите даты записей, где флаг miles_expire установлен в значение true, дата истечения срока действия предшествует текущей дате, а флаг обработки установлен в значение false. Это позволит получить записи по всем милям, срок действия которых истек.
Обратите внимание, что это может быть только одна запись. Если вы выполняете свою проверку очень часто, это будет фактически только одна запись. Давайте для простоты предположим, что максимум одна запись истекает каждый день (если истекает более одной записи, ваш алгоритм все еще не работает, это просто сложнее объяснить).
Получить первую и последнюю дату expiration_date из предыдущего запроса.
Здесь вы получите ту же дату, потому что есть только одна запись.
Используя первое и последнее значения expiration_date из предыдущего шага, получите список всех использованных миль в этом диапазоне дат.
Поскольку первые и последние равны, дальности нет, поэтому в этом диапазоне никогда не будет использовано миль.
Если сумма использованных миль с предыдущего шага меньше суммы баллов, срок действия которых истекает, разница истекает. Если использованные мили равны или больше, срок действия не должен истекать.
Поскольку предыдущий шаг не вернул ни одной строки, сумма равна нулю, поэтому у вас всегда будет разница между «просроченными милями» и «0». Даже если мили были использованы.
Этот процесс будет повторяться.
В целом ваш дизайн кажется излишне составленным. Я бы просто сохранил список неиспользованных ваучеров для каждого пользователя. Когда они платят, используемые ваучеры помечаются как использованные. Если ваучер используется наполовину, он помечается как использованный, и выдается новый ваучер с той же датой истечения срока действия, но с меньшей суммой. Если ваучеров больше, чем необходимо, ваучеры, срок действия которых истекает, используются первыми, а ваучеры с истекающим сроком действия - последними. Ваучеры, срок действия которых истек, никогда не могут быть использованы для оплаты, поэтому вам не нужно ничего делать, чтобы истечь их.
Итак, подведем итог: вам не нужно просрочивать ваучеры, просто убедитесь, что в коде платежа не разрешено использование просроченных или использованных ваучеров.