Вообще это выглядит как плохая и неочевидная архитектура.
Начисление/списание - это факт который должен происходить в транзакции в конкретный момент времени.
Если у Вас есть "протухающие" бонусы - соответственно нужно по крону с пользователей их вычитать, создавая новые записи в момент протухания.
Если уж совсем никак - надо добавить в текущую логику 3й запрос: количество протухших бонусов
select sum(points) from ... where date_end < now() and points > 0
Текущие бонусы = начисленные - потраченные - протухшие.