Java PreparedStatementからMySqlのタイムスタンプフィールドを更新するにはどうすればよいですか?

マイケル

私のindex.htmlには<input type="datetime-local">フィールドがあり、ユーザーが選択した値でMySqlデータベースを更新する必要があります。私のデータベースフィールドは現在タイムスタンプです。このdatetime-local値でデータベースを更新できるようにするupdateステートメントを作成するにはどうすればよいですか?私は多くのオプションを試しましたが、現在の試みを以下に示します。ただし、これは機能しません。私はこれをすべてJavaで行っています。

String updateStatement = "UPDATE cars SET reservation = ? WHERE uniqueID = ?";

pStmt = con.prepareStatement(updateStatement);
pStmt.setTimestamp(1, reservation);
pStmt.setTimestamp(2, someUniqueId);
バジル・ボーク

tl; dr

特定のコードの質問に答えるには(ただし、これは予定/予約を処理するための間違った方法です):

myPreparedStatement
.setObject(
    1 ,
    ZonedDateTime
    .of
    (
        LocalDate.of( 2021 , Month.JANUARY , 23 ) ,
        LocalTime.of( 15 , 30 ) ,
        ZoneId.of( "Africa/Tunis" ) 
    )
    .toInstant()
    .atOffset( ZoneOffset.UTC )
)
;

java.time

TIMESTAMPMySQLタイプは、UTCから0時間-分-秒のオフセットから見た、タイムライン上の特定のポイントである瞬間を追跡するためのものであり、マイクロ秒に解決されますこれはTIMESTAMP WITH TIME ZONE、標準SQLにマップされます。

Javaでの適切な一致はjava.time.Instantです。このクラスもUTCで見られる瞬間を表しますが、ナノ秒のより細かい解像度で表示されます。

残念ながら、JDBC 4.2仕様では、瞬間を追跡する3つのタイプのうちの1つのみをサポートする必要がありますOffsetDateTimeInstantZonedDateTime両方ともJDBC4.2ではオプションです。したがって、特定のJDBCドライバーはをサポートする場合とサポートしない場合がありInstantます。JDBCチームによるこの設計上の決定は、私を困惑させます。間の変換InstantOffsetDateTime全く簡単で、JDBC仕様で要求されている必要があります。

特定のタイムゾーン内の日付と時刻をユーザーが選択できるようにしていると思います。しかし、あなたがあなたの入力を詳述することを怠ったので、私はよくわかりません。

LocalDate localDate = LocalDate.of( 2021 , Month.JANUARY , 23 ) ;
LocalTime localTime = LocalTime.of( 15 , 30 ) ;
ZoneId zoneId = ZoneId.of( "America/Edmonton" ) ;
ZonedDateTime zdt = ZonedDateTime.of( localDate, localTime , zoneId ) ;

データベースに保存するには、タイムゾーンからUTC(ゼロのオフセット)に調整しましょう。以下からの変換ZonedDateTimeInstantし、その後にOffsetDateTimeゼロ時間-分-秒定数によって表されるのオフセットを持ちますZoneOffset.UTC

OffsetDateTime odt = zdt.toInstant().atOffset( ZoneOffset.UTC ) ;  // Use `OffsetDateTime` rather than `Instant` for maximum compatibility across JDBC 4.2 drivers.

呼び出さないでくださいPreparedStatement#setTimestampそのメソッドは、ひどいjava.sql.Timestampクラスにとって、今ではレガシーです。java.timeパッケージの外部で日時クラスを使用しないでくださいこれらのレガシークラスは、数年前にJSR310で定義された最新のjava.timeクラスに取って代わられました。

を呼び出しPreparedStatement#setObjectます。JDBCチームはset…、さまざまなjava.timeクラスの特定のメソッドをまだ定義していません繰り返しますが、私を困惑させる設計上の決定。ただし、/を使用しjava.timeオブジェクトを交換できますsetObjectgetObject

myPreparedStatement.setObject( … , odt ) ;

検索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

予定の追跡

ちなみに、ビジネス上の問題は将来のレストランの予約だとおっしゃいました。この仕事のために、あなたは間違ったアプローチを取っています。

そのような将来の予定をされていない瞬間として追跡、あるいないタイムライン上の特定の点。政治家がそのタイムゾーンで使用されるオフセットを変更した場合、顧客は、政治家が時計を前後に動かしても、午後7時のレストランの予約が午後7時にとどまると予想します。同様に、政治家がオフセットを変更した場合でも、4か月後の午後3時の歯科予約は午後3時にとどまる必要があります。そして、世界中の政治家は、タイムゾーンのオフセットを変更することを楽しんでます。これは驚くほど頻繁に発生し、事前の警告も少なくなります。

予約/予定は、タイムゾーンなしの日付と時刻として追跡し、データベースの2番目の列にタイムゾーンを個別に保存する必要があります。これらのタイプはTIMESTAMP WITHOUT TIME ZONE、標準SQLとDATETIMEMySQLにあります。また、タイムゾーン識別子にはテキストタイプを使用します。Javaでのマッチングタイプは次のようになりますLocalDateTimeZoneId予定表の実行時に、を組み合わせて瞬間を決定しZonedDateTimeます。

私と他の著者は、すでにStackOverflowでこれを何度も取り上げています。したがって、詳細については検索してください。


java.timeについて

java.timeフレームワークはJava8以降に組み込まれています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

詳細については、Oracleチュートリアルを参照してくださいそして、StackOverflowで多くの例と説明を検索してください。仕様はJSR310です。

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

java.timeオブジェクトをデータベースと直接交換できます。JDBC4.2以降に準拠しJDBCドライバーを使用してください文字列もクラスも必要ありませんHibernate5およびJPA2.2はjava.timeをサポートしますjava.sql.*

java.timeクラスはどこで入手できますか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavaでPreparedStatementを使用してmySqlデータベースに日時フィールドを挿入するにはどうすればよいですか?

分類Dev

Javaのインターフェースからクラスにフィールドを追加するにはどうすればよいですか?

分類Dev

Javaを使用してPostgresタイムスタンプフィールドを抽出するにはどうすればよいですか?

分類Dev

WindowsのJavaサービスにタイムスタンプGCログファイル名を追加するにはどうすればよいですか?

分類Dev

WindowsのJavaサービスにタイムスタンプGCログファイル名を追加するにはどうすればよいですか?

分類Dev

Javaでアノテーションを適用するフィールドのタイプを指定するにはどうすればよいですか?

分類Dev

Javaのデータベースのフィールドに基づいてフォームを作成するにはどうすればよいですか?

分類Dev

Javaアプリのカスタムフレームとタスクバーアイコンを設定するにはどうすればよいですか?

分類Dev

Javaからインタラクティブなコマンドラインインターフェイスプログラムを起動するにはどうすればよいですか?

分類Dev

WEKA(Java)でカスタムストップワードとステマーファイルを使用するにはどうすればよいですか?

分類Dev

(Java-> Kotlin)このコードを変換するにはどうすればよいですか?(ストリーム、フィルター)

分類Dev

Javaエディターをインストールするにはどうすればよいですか

分類Dev

デフォルトのJavaインストール/ランタイム(Windows)を設定するにはどうすればよいですか?

分類Dev

Gradle APIを使用してJavaプログラムからapkファイルを生成するにはどうすればよいですか?可能であれば、エミュレーターにもインストールする方法は?

分類Dev

スイングJavaのポップアップで複数のjpasswordフィールドを表示するにはどうすればよいですか?

分類Dev

__radd__を使用してPythonで行うことができるように、Javaでインスタンスにフィールドの文字列を直接返すようにするにはどうすればよいですか?

分類Dev

JAXBで生成されたJavaファイルからフィールド名/要素のリストを取得するにはどうすればよいですか?

分類Dev

Javaのジェネリックフィールドのタイプを判別するにはどうすればよいですか?

分類Dev

Javaの特定のフィールド値に基づいてSparkRDDをフィルタリングするにはどうすればよいですか?

分類Dev

Java Webアプリケーションのlibフォルダーにカスタムjarを公開するにはどうすればよいですか?

分類Dev

コンボボックスを介してJavaでフレームのタイトルを設定するにはどうすればよいですか?

分類Dev

Javaオブジェクトのフィールドタイプと値を取得するにはどうすればよいですか?

分類Dev

Javaでタイムゾーンオフセットからタイムゾーンを取得するにはどうすればよいですか?

分類Dev

Javaで予想されるタイムゾーンでOracleタイムスタンプ列を取得するにはどうすればよいですか?

分類Dev

Javaで予想されるタイムゾーンでOracleタイムスタンプ列を取得するにはどうすればよいですか?

分類Dev

UNIXシェルスクリプトからJavaプログラムの完了ステータスを取得するにはどうすればよいですか?

分類Dev

Couchbase Java Query DSLで、ASCII以外のフィールド値をフィルタリングするにはどうすればよいですか?

分類Dev

Java 8 Streamフィルタリングから削除されたアイテムのリストをキャプチャするにはどうすればよいですか?

分類Dev

JSoupでネストされたタグのノイズをフィルタリングするにはどうすればよいですか?java

Related 関連記事

  1. 1

    JavaでPreparedStatementを使用してmySqlデータベースに日時フィールドを挿入するにはどうすればよいですか?

  2. 2

    Javaのインターフェースからクラスにフィールドを追加するにはどうすればよいですか?

  3. 3

    Javaを使用してPostgresタイムスタンプフィールドを抽出するにはどうすればよいですか?

  4. 4

    WindowsのJavaサービスにタイムスタンプGCログファイル名を追加するにはどうすればよいですか?

  5. 5

    WindowsのJavaサービスにタイムスタンプGCログファイル名を追加するにはどうすればよいですか?

  6. 6

    Javaでアノテーションを適用するフィールドのタイプを指定するにはどうすればよいですか?

  7. 7

    Javaのデータベースのフィールドに基づいてフォームを作成するにはどうすればよいですか?

  8. 8

    Javaアプリのカスタムフレームとタスクバーアイコンを設定するにはどうすればよいですか?

  9. 9

    Javaからインタラクティブなコマンドラインインターフェイスプログラムを起動するにはどうすればよいですか?

  10. 10

    WEKA(Java)でカスタムストップワードとステマーファイルを使用するにはどうすればよいですか?

  11. 11

    (Java-> Kotlin)このコードを変換するにはどうすればよいですか?(ストリーム、フィルター)

  12. 12

    Javaエディターをインストールするにはどうすればよいですか

  13. 13

    デフォルトのJavaインストール/ランタイム(Windows)を設定するにはどうすればよいですか?

  14. 14

    Gradle APIを使用してJavaプログラムからapkファイルを生成するにはどうすればよいですか?可能であれば、エミュレーターにもインストールする方法は?

  15. 15

    スイングJavaのポップアップで複数のjpasswordフィールドを表示するにはどうすればよいですか?

  16. 16

    __radd__を使用してPythonで行うことができるように、Javaでインスタンスにフィールドの文字列を直接返すようにするにはどうすればよいですか?

  17. 17

    JAXBで生成されたJavaファイルからフィールド名/要素のリストを取得するにはどうすればよいですか?

  18. 18

    Javaのジェネリックフィールドのタイプを判別するにはどうすればよいですか?

  19. 19

    Javaの特定のフィールド値に基づいてSparkRDDをフィルタリングするにはどうすればよいですか?

  20. 20

    Java Webアプリケーションのlibフォルダーにカスタムjarを公開するにはどうすればよいですか?

  21. 21

    コンボボックスを介してJavaでフレームのタイトルを設定するにはどうすればよいですか?

  22. 22

    Javaオブジェクトのフィールドタイプと値を取得するにはどうすればよいですか?

  23. 23

    Javaでタイムゾーンオフセットからタイムゾーンを取得するにはどうすればよいですか?

  24. 24

    Javaで予想されるタイムゾーンでOracleタイムスタンプ列を取得するにはどうすればよいですか?

  25. 25

    Javaで予想されるタイムゾーンでOracleタイムスタンプ列を取得するにはどうすればよいですか?

  26. 26

    UNIXシェルスクリプトからJavaプログラムの完了ステータスを取得するにはどうすればよいですか?

  27. 27

    Couchbase Java Query DSLで、ASCII以外のフィールド値をフィルタリングするにはどうすればよいですか?

  28. 28

    Java 8 Streamフィルタリングから削除されたアイテムのリストをキャプチャするにはどうすればよいですか?

  29. 29

    JSoupでネストされたタグのノイズをフィルタリングするにはどうすればよいですか?java

ホットタグ

アーカイブ