将以下内容插入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。
答案 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
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
。从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();