将确切时间插入数据库

时间:2013-09-06 16:02:25

标签: java sql-server

将以下内容插入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。

2 个答案:

答案 0 :(得分:1)

某些数据库仅存储日期的第二个精度。

SQLserver' s datetime支持小数秒,但它会舍入到最接近的3毫秒。

如果您需要更高的精度,请将日期存储为bigint类型并改为传递now.getTime() Java long值。

答案 1 :(得分:1)

你可能会感到困惑:

  • java.util.Date类代表日期以UTC为单位的时间
  • java.sql.Date类,代表仅限日期,没有时间和没有时区。

实际上,java.sql.Date扩展了java.util.Date,所以它实际上继承了一个时间,但假装没有时间,可以通过在UTC中将其设置为00:00:00.0来实现。类doc告诉你忽略继承关系(它是一个hack)。混乱?是的,这些旧的日期时间课程一团糟,设计糟糕,令人困惑,并且很麻烦。

这些旧类被Java 8及更高版本中内置的java.time类取代。许多功能已经被后端移植到Java 6& 7在ThreeTen-Backport中,并在ThreeTenABP中进一步适应Android。

如果您的数据库列的类型类似于SQL标准类型TIMESTAMP WITH TIME ZONE,那么您可以使用:

  • Instant
    在UTC时间轴上的片刻,分辨率高达纳秒。
    Instant instant = Instant.now();
  • ZonedDateTimeInstant一样,但已调整为特定时区。
    ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );

如果您的JDBC驱动程序符合JDBC 4.2规范,您可以通过setObject上的PreparedStatement方法传递其中任何一个。

如果您的驱动程序不支持直接使用java.time类型,请回退到使用java.sql类型。查找添加到旧类的新方法,以便转换为/从java.time类型转换。您正在寻找java.sql.Timestamp类,特别是日期时间值,可以转换为/ Instant。从ZonedDateTime,您可以提取Instant用于转换目的。

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

走向另一个方向。

Instant instant = mySqlTimestamp.toInstant();