1

以下を SQL データベースに挿入すると、次のようになります。

Date now = new Date(System.currentTimeMillis());
PreparedStatement audit = sqlConn.prepareStatement("INSERT INTO [Table](Date) VALUES (?)");
audit.setDate(1, now);
audit.execute();

結果は次のとおりです。

2013-09-06 00:00:00.000

データベースに挿入された時刻情報を取得するにはどうすればよいですか?

編集: 列のデータ型は DateTime です。

4

2 に答える 2

1

あなたは混乱しているかもしれません:

  • 日付と時刻を UTCでjava.util.Date表すクラス
  • 時刻とタイム ゾーンのjava.sql.Dateない、日付のみを表すクラス。

00:00:00.0実際には、java.sql.Date は java.util.Date を拡張するため、実際には時刻を継承しますが、時刻を UTCに設定することで、時刻を持たないふりをします。クラスのドキュメントでは、継承関係を無視するように指示されています (これはハックです)。混乱しますか?はい、これらの古い日時クラスはごちゃごちゃしていて、設計が不十分で、混乱を招き、面倒です。

これらの古いクラスは、Java 8 以降に組み込まれたjava.timeクラスに取って代わられました。機能の多くは、ThreeTen-Backport で Java 6 および 7 にバックポートされ、さらに ThreeTenABP で Android に適合されています。

データベース列が SQL 標準型 TIMESTAMP WITH TIME ZONE と同様の型である場合は、次のいずれかを使用できます。

  • Instant
    ナノ秒までの解像度を持つ UTC のタイムライン上の瞬間。
    Instant instant = Instant.now();
  • ZonedDateTime
    のようInstantですが、特定のタイムゾーンに調整されています。
    ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );

JDBC ドライバーが JDBC 4.2 仕様に準拠している場合setObjectは、PreparedStatement.

ドライバーが java.time 型の直接使用をサポートしていない場合は、java.sql 型の使用にフォールバックします。java.time 型との間で変換するために古いクラスに追加された新しいメソッドを見つけます。java.sql.Timestampに/から変換できる、特に日時値のクラスを探していますInstant。この変換のために、 a からZonedDateTimean を抽出できます。Instant

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

別の方向に進みます。

Instant instant = mySqlTimestamp.toInstant();
于 2016-06-29T04:28:17.907 に答える
1

一部のデータベースは、日付の 2 番目の精度までしか保存しません。

SQLserverdatetimeは小数秒をサポートしていますが、最も近い 3 ミリ秒に丸められます。

さらに精度が必要な場合は、日付を bigint 型として保存し、代わりにnow.getTime()Javalong値を渡します。

于 2013-09-06T16:04:10.150 に答える