У меня есть таблица базы данных, в которой хранятся пользовательские pu sh настройки времени уведомления с полями local_push_time и local_time_zone. У меня есть автоматическое задание, которое запускается на наших серверах (по времени UT C) каждые 10 минут, и я ищу пользователей, которые должны получить уведомление pu sh в ближайшие 10 минут.
Поскольку мы используем Django, почти весь наш доступ к данным происходит через Django API QuerySet, который в основном делает то, что нам нужно. Но для описанного выше варианта использования я не нашел способа, чтобы API QuerySet мог здесь помочь. В итоге я написал необработанный SQL, который выглядит примерно так:
SELECT *
FROM user_push_preferences
WHERE CAST(CAST(CAST(NOW() AS DATE) + CAST(local_push_time AS TIME) AS TIMESTAMP) AT TIME ZONE local_time_zone AS TIME) >= CAST(NOW() AS TIME)
AND CAST(CAST(CAST(NOW() AS DATE) + CAST(local_push_time AS TIME) AS TIMESTAMP) AT TIME ZONE local_time_zone AS TIME) < CAST(NOW() AS TIME) + interval '10 minute’;
Мы рассматривали вопрос о сохранении поля utc_push_time в таблице БД, но это было не начало, так как он должен будет обновляться по мере того, как local_time_zone перемещается в летнее время или выходит из него.
Так что я действительно хочу иметь возможность вычислять utc_push_time на лету, а затем иметь возможность фильтровать, используя вычисленные значения поле. Это возможно? Или я что-то упустил из-за того, что Django API QuerySet может сделать, чтобы это было проще?