У меня есть таблица Postgres сигналов будильника (на самом деле это не так, но это аналогично и проще объяснить). Сигналы тревоги устанавливаются пользователями с разрешением 1 час, и пользователи могут быть из разных разных часовых поясов. Тревоги повторяются ежедневно. Я хочу надежно получить тревоги, которые должны уходить в определенный час дня, и я имею проблемы с летним временем. Как это сделать наилучшим образом?
Пример
Альфред и Лотта живут в Стокгольме (+1 час от UTC, но + 2h когда это DST).
Шарон живет в Сингапуре (+8 часов от UTC, нет ДСТ)В течение зимы Альфред устанавливает будильник в течение 4 часов. Сигнал тревоги должен погаснуть в 4 часа по местному времени, в течение всего года.
Летом Лотта устанавливает будильник на 5 утра. Опять же, он должен уходить в 5 утра круглый год.
Между тем, Шарон установил будильник на 11 часов утра.Все они могут быть сохранены в базе данных как 03:00 UTC.
Если я запрашиваю базу данных зимой для аварийных сигналов, которые должны 03:00 UTC, мне нужны сигналы тревоги Альфреда и Шарона. Сингапур теперь + 7 часов из Швеции, поэтому 11 часов в Сингапуре - 4 часа в Швеции. Тревога Лотта не должен уходить в течение еще одного часа.
И наоборот, если я запрошу базу данных летом для аварийных сигналов, которые должен уйти в 03:00 UTC, я хочу, чтобы сигналы тревоги Лотты и Шарона. Сингапур сейчас + 6 часов из Швеции, поэтому 11 часов в Сингапуре - 5 утра в Швеция. Сигнал Свена ушел час назад.
Как сохранить это и запросить базу данных?
При необходимости я могу изменить схему db. На данный момент мы вообще не настраиваемся на DST и на самом деле просто имеем целое число "час" (что кажется глупым, поле времени было бы лучше).
Кажется, мне нужно хранить информацию о времени и времени часового пояса, но я не знаю, как добиться этого в Postgres. Я обнаружил, что Postgres имеет какую-то концепцию часовых поясов, но, насколько я могу судить, не имеет типа поля часового пояса. Кроме того, я думаю, мне нужно сделать некоторые вычисления в SQL, чтобы определить, как компенсировать время UTC в выборе, основанное на данных часового пояса и дате создания. Я не очень хорошо разбираюсь в SQL...
Я хочу решить это в Postgres, так как может быть много "аварийных сигналов", и я хочу избежать проблем с производительностью, связанных с их загрузкой в Ruby и фильтром там. (Да, это приложение Rails.)