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

Javaを使用してデータベース接続でMySQLタイムゾーンを変更するにはどうすればよいですか?

    useTimezoneは古い回避策です。 MySQLチームはごく最近setTimestamp/getTimestampコードを書き直しましたが、接続パラメーターuseLegacyDatetimeCode =falseを設定し、最新バージョンのmysqlJDBCコネクターを使用している場合にのみ有効になります。たとえば:

    String url =
     "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
    

    mysql-connectorのソースコードをダウンロードしてsetTimestampを見ると、何が起こっているのかを簡単に確認できます。

    従来の日時コード=falseを使用すると、newSetTimestampInternal(...)が呼び出されます。次に、newSetTimestampInternalに渡されるカレンダーがNULLの場合、日付オブジェクトはデータベースのタイムゾーンでフォーマットされます。

    this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
    this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
    timestampString = this.tsdf.format(x);
    

    カレンダーがnullであることが非常に重要です。したがって、使用していることを確認してください:

    setTimestamp(int,Timestamp).
    

    ... setTimestamp(int、Timestamp、Calendar)ではありません。

    これがどのように機能するかは明らかです。 java.util.Calendarを使用して2011年1月5日午前3:00にAmerica/Los_Angeles(または任意のタイムゾーン)で日付を作成し、setTimestamp(1、myDate)を呼び出すと、日付が取得されます。SimpleDateFormatを使用してください。 データベースのタイムゾーンでフォーマットします 。したがって、DBがAmerica / New_Yorkにある場合、挿入される文字列 '2011-01-05 6:00:00'が作成されます(NYはLAより3時間進んでいるため)。

    日付を取得するには、getTimestamp(int)(カレンダーなし)を使用します。ここでも、データベースのタイムゾーンを使用して日付を作成します。

    注:ウェブサーバーのタイムゾーンは完全に無関係になりました! useLegacyDatetimecodeをfalseに設定しない場合、Webサーバーのタイムゾーンがフォーマットに使用され、多くの混乱が生じます。

    注:

    MySQLがサーバーのタイムゾーンがあいまいであると不平を言っている可能性があります。たとえば、データベースがESTを使用するように設定されている場合、Javaにはいくつかの可能なESTタイムゾーンが存在する可能性があるため、データベースのタイムゾーンを正確に指定することで、mysql-connectorのこれを明確にすることができます。

    String url =
     "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
    

    不平を言う場合にのみこれを行う必要があります。



    1. 前月のすべての日付を一覧表示するoraclesqlクエリ

    2. 実行計画のStarJoinInfo

    3. Oracle文字列集約

    4. 初心者向けSQLExpressを使用したPythonデータベースプログラミング