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

java.sql.Timestampタイムゾーンは特定ですか?

    setTimestamp(int parameterIndex, Timestamp x)には明示的に指定されていませんが ドライバーは、setTimestamp(int parameterIndex, Timestamp x, Calendar cal)によって確立されたルールに従う必要があります javadoc:

    指定されたパラメータを指定されたjava.sql.Timestampに設定します 指定されたCalendarを使用した値 物体。ドライバーはCalendarを使用します SQL TIMESTAMPを構築するオブジェクト 値。ドライバーはこれをデータベースに送信します。 Calendar オブジェクトの場合、ドライバーはカスタムタイムゾーンを考慮してタイムスタンプを計算できます。 Calendarがない場合 オブジェクトが指定されている場合、ドライバーはデフォルトのタイムゾーンを使用します。これは、アプリケーションを実行している仮想マシンのタイムゾーンです。

    setTimestamp(int parameterIndex, Timestamp x)で呼び出す場合 JDBCドライバーは、仮想マシンのタイムゾーンを使用して、そのタイムゾーンのタイムスタンプの日付と時刻を計算します。この日時はデータベースに保存されるものであり、データベース列にタイムゾーン情報が保存されていない場合、ゾーンに関する情報はすべて失われます(つまり、データベースを使用するアプリケーションは、同じタイムゾーンを一貫して作成するか、タイムゾーンを識別するための別のスキームを考え出します(つまり、別の列に保存します)。

    例:ローカルタイムゾーンはGMT+2です。 「2012-12-2510:00:00UTC」を保存します。データベースに保存されている実際の値は「2012-12-2512:00:00」です。再度取得します。「2012-12-2510:00:00 UTC」として再度取得します(ただし、getTimestamp(..)を使用して取得した場合のみ )、ただし、別のアプリケーションがタイムゾーンGMT + 0でデータベースにアクセスすると、タイムスタンプは「2012-12-2512:00:00UTC」として取得されます。

    別のタイムゾーンに保存する場合は、setTimestamp(int parameterIndex, Timestamp x, Calendar cal)を使用する必要があります。 必要なタイムゾーンのCalendarインスタンスを使用します。値を取得するときは、同じタイムゾーンで同等のゲッターも使用するようにしてください(TIMESTAMPを使用する場合) データベースにタイムゾーン情報がありません)。

    したがって、実際のGMTタイムゾーンを保存する場合は、次を使用する必要があります。

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    stmt.setTimestamp(11, tsSchedStartTime, cal);
    

    JDBC 4.2では、準拠ドライバーはjava.time.LocalDateTimeをサポートする必要があります (およびjava.time.LocalTimeTIMESTAMPの場合 (およびTIMEget/set/updateObjectを介して 。 java.time.Local* クラスにはタイムゾーンがないため、変換を適用する必要はありません(ただし、コードが特定のタイムゾーンを想定している場合は、新しい一連の問題が発生する可能性があります)。



    1. MySQLとMariaDBデータベースのバックアップリソース

    2. Oracleでネストされたトランザクションを使用する

    3. スタックの構成-MySQLコンテナのDockerデプロイメントを簡素化する

    4. PostgreSQLエラーログをデコードする方法