Что именно значит "функцию не выполняет"? Вообще ничего не срабатывает (даже хэндлер), не добавляет бонус, неправильно добавляет бонус, не выводит сообщения, или не запускается именно функция timer_bonus_db? Вариантов же много, пишите конкретнее в вопросах.
1. Лучше вообще никогда не использовать подстановку значений в запрос через форматирование, как сделано тут:
sql.execute(f"SELECT timer_bonus FROM users WHERE telegram_id LIKE '%{telegram_id}%'")
А всегда использовать через подстановку параметров (?), как Вы уже и делали в других местах
cursor.execute('SELECT balance FROM users WHERE telegram_id = ?;', (telegram_id,))
cursor.execute('UPDATE users SET balance = ? WHERE telegram_id = ?', (balance, telegram_id))
2. После изменения данных (insert, update, delete) нужно делать commit. В основном коде вижу это делается, а вот в dp.py (timer_bonus_db) явно у вас не показано, возможно там забыли. Т.к. это отдельное соединение (судя по тому, что делаете через класс), то там и свой commit нужно не забывать делать. Если у вас в этом классе commit принудительно нигде не делается, то это скорее всего и есть причина неправильной работы вашей команды.
3. Откуда взялось число 4356 в расчете?
time_to_end /= 4356
Время (текущее и из поля базы) у вас идет в секундах, затем для перевода в часы соответственно нужно делить на (60*60 = 3600).
4. В timer_bonus_db достаете timer_bonus из запроса в виде кортежа и конвертируете в число:
с = float(timer_bonus[0])
Но затем при проверке все равно используете кортеж
if timer_bonus != 0:
Что неправильно, т.к. если даже вернет 0, то получится
(0, ) != 0
что тоже сработает