クロックアラームのPostgresテーブルがあります(実際にはそうではありませんが、これは類似しており、説明が簡単です)。アラームは1時間の解像度でユーザーによって設定され、ユーザーはさまざまなタイムゾーンのユーザーである可能性があります。アラームは毎日繰り返されています。1日の特定の時間に鳴るはずのアラームを確実に取得したいのですが、夏時間に問題があります。どうすればこれを最善の方法で行うことができますか?
例
アルフレッドとロッタはどちらもストックホルムに住んでいます(UTCから+1時間、DSTの場合は+ 2時間)。
シャロンはシンガポールに住んでいます(UTCから+8時間、DSTなし)冬の間、アルフレッドは午前4時にアラームを設定します。アラームは、一年中現地時間の午前4時に鳴るはずです。
夏の間、ロッタは午前5時にアラームを設定します。繰り返しになりますが、一年中午前5時にオフになります。
その間、シャロンは午前11時にアラームを設定しました。これらはすべて、03:00UTCとしてデータベースに保存できます。
冬にUTC03:00に鳴るアラームをデータベースに照会する場合、アルフレッドとシャロンのアラームが必要です。シンガポールは現在スウェーデンから+7時間なので、シンガポールの午前11時はスウェーデンの午前4時です。ロッタのアラームはもう1時間鳴らないはずです。
逆に、夏にUTC 03:00に鳴るアラームをデータベースに照会する場合は、ロッタとシャロンのアラームが必要です。シンガポールは現在スウェーデンから+6時間なので、シンガポールの午前11時はスウェーデンの午前5時です。スヴェンのアラームは1時間前に鳴りました。
これを保存してデータベースにクエリを実行するにはどうすればよいですか?
必要に応じてdbスキーマを変更できます。現時点では、DSTはまったく調整されておらず、実際には「時間」整数フィールドがあります(これはばかげているようですが、時間フィールドの方が適しています)。
UTC時間とタイムゾーン情報の両方を保存する必要があるようですが、Postgresでこれを最もよく達成する方法がわかりません。Postgresにはある種のタイムゾーンの概念があることがわかりましたが、私が知る限り、タイムゾーンフィールドタイプはありません。また、タイムゾーンデータと作成日に基づいて、選択でUTC時間をオフセットする方法を決定するために、SQLでいくつかの計算を行う必要があると思います。私はSQLが苦手です…</p>
多くの「アラーム」が存在する可能性があるため、Postgresでこれを解決したいと思います。また、それらすべてをRubyにフェッチしてそこでフィルタリングすることに伴うパフォーマンスの問題を回避したいと思います。(はい、これはRailsアプリです。)