3

次の列を持つテーブルがあります。

|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でこれを行うにはどうすればよいですか?

4

1 に答える 1

3

おそらく役立つと思われる関数が 2 つあります。

1 つ目は次のとおりです。

STR_TO_DATE(start_date,'%M %d,%Y')

これにより、指定された形式の文字列が MySQLDATEデータ型に変換されます。あなたがmysql.time_zone_nameet alを持っているなら。テーブルにデータが入力されたら、次の関数を使用できます。

CONVERT_TZ()

( CONVERT_TZDATE を取り、DATETIME または TIMESTAMP を返すか、または DATETIME を取得するために変換される文字列に時刻コンポーネントを含めるかを確認する必要があります。

STR_TO_DATE( CONCAT(start_date,' 00:00:00'),'%M %d,%Y %T')

その式を CONVERT_TZ() 関数でラップします。

CONVERT_TZ(  datetime_expr ,'US/Eastern','GMT')

列に格納されている値を利用するにTZは、テーブルに格納されている値と一致するか、一致する方法を考え出す必要がありmysql.time_zone_nameます。

于 2012-12-18T21:30:13.633 に答える