次の列を持つテーブルがあります。
|start_date |TZ |
|Dec 2, 2012 |Eastern |
|Dec 2, 2012 |GMT |
注 1: サーバーは UTC 時間です。
注 2: start_date 列は日付フィールドであり、タイムスタンプ フィールドではありません。Dec 2nd 2012 は暗黙的に "2012-12-02 00:00:00" を意味します
注 3: 上記の表は実際には複数の正規化された表ですが、簡単にするために非正規化しています。
注 4: これを簡単にするために、TZ テーブルには何でも入れることができます。
私はしたいと思いますselect from my_table where start_date <= now()
ただし、これはタイムゾーンのために機能しません。現在の日付/時刻が 12 月 1 日東部標準時午後 9 時 (12 月 2 日午前 1 時 UTC) の場合、上記のクエリは両方の結果を返しますが、実際には 2 番目の結果のみが必要です。これは、夏時間によってさらに複雑になります。
理想的には、次のようなクエリが必要です。
select * from my_table where convert_to_utc_timestamp(start_date,tz) <= now()
上記のメソッドは、start_date をタイムスタンプに変換してから、正しいタイムゾーンに変換します。
SQLでこれを行うにはどうすればよいですか?