sql >> データベース >  >> RDS >> Mysql

SQLとのタイムゾーンの調整

    1/3

    go IANAのタイムゾーンデータベース を使用します 正確なゾーン名を使用します。MySQLが(Linux)ホストからローカルタイムゾーン形式を決定する方法をリバースエンジニアリングし、そのロジックをgoに複製しようとしています。 @MattJohnsonが指摘したように、クライアントは信頼できないことがわかっています。

    2/3

    database/sql.DB -Open(drv, DSN)を介して作成 -同じDSNを使用します すべての接続に対して。 sql.DB 一度作成して何度も使用することを目的としています-DSNを変更する方法はありません 事後-新しいsql.DBを作成する必要があります DSNを変更する場合 。

    3/3

    したがって、より良いタックは、MySQLを活用しているように見えます すべてのdatetimeを変換します クライアントに送信する前のローカルからUTCタイムゾーンまでの値。これにより、DSNを介した接続時にデータベースの(おそらく不明な)タイムゾーンを設定する煩わしさがなくなります。 。

    有望なオプションの1つは、接続のセッションタイムゾーンを設定することです。

    • SET @@session.time_zone = "+00:00";
    • ただし、これは現在でのみ機能します 接続(接続プール内)。 go ただし、クライアントはいつでもどの無料接続を使用しているのかわかりません。
    • したがって、これが常に機能するようにするには、すべてのクエリの前に手動で適用する必要があります。 。 1つのDB接続のみが使用されている場合でも(接続が失敗して接続の再試行が開始された場合)、以前のセッション状態はすべて失われます。

    したがって、代わりに、すべてのdatatimeをラップします 次のような変換関数を持つ列:

    CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
    

    タイムゾーンの計算がクエリ時に行われ、接続の再接続などで失われないようにします。

    だから今DSN locを指定する必要がなくなりました -UTCとして デフォルトです。実際、DSN ?parseTime=trueのサフィックスオプションのみが必要です datetimeを許可する goに変換されます のネイティブtime.Time

    最後に、そして最も重要なこととして、これは任意のタイムゾーンに設定された任意のサーバーで機能します。

    この回答 へのH/T 。




    1. MySQLで日付から月を取得する方法

    2. Jbossデータソースでのデータベースフェイルオーバー

    3. MySQLのすべての関数を一覧表示する2つの方法

    4. Pythonディクショナリ(dict)オブジェクトをMySQLテーブルにダンプする最も簡単な方法は?