在Oracle中存储时间戳(以毫秒为单位)

时间:2014-06-27 09:27:06

标签: java sql oracle plsql

我知道如何以毫秒检索时间戳:

to_char(systimestamp ,'YYYY-MM-DD HH24:MI:SS,FF9')

有人可以建议,时间戳数据类型是否足以以毫秒存储日期或者我可以使用varchar2吗?我试图从Java中插入这个值。

2 个答案:

答案 0 :(得分:2)

是的,如果你需要,TIMESTAMP可以将精度降低到几纳秒。

如果您只需要毫秒,则只需要一个TIMESTAMP(3)列。

在Java端使用java.sql.Timestamp(如果需要,可再次降至纳秒)。请注意,如果可能,您应该避免进行to_char转换 - 执行客户端需要的任何字符串转换;将数据作为时间戳获取,并将其作为时间戳发送。

答案 1 :(得分:0)

TL;博士

使用智能对象,而不是愚蠢的字符串。使用 java.time 进行纳秒分辨率。

myResultSet.getObject( … , LocalDateTime.class )

java.time

Answer by Jon Skeet是正确的,但现在过时了。 java.sql.Timestamp类被 java.time 类取代,例如InstantLocalDateTime

java.time 类的分辨率为纳秒,足以达到毫秒级。

Oracle数据库seems to have a TIMESTAMP type,它等同于SQL标准类型TIMESTAMP WITHOUT TIME ZONE。这意味着它缺乏time zoneoffset-from-UTC的任何概念。对于这样的列,在Java中使用LocalDateTime,因为它也缺少任何区域/偏移的概念。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

要存储到类似于SQL标准TIMESTAMP WITH TIME ZONE的类型的字段中,请注意区域/偏移,请使用Instant

Instant instant = Instant.now() ;  // Capture current moment as fine as nanoseconds. In practice, we get microseconds in Java 9, but only milliseconds in Java 8.

从JDBC 4.2及更高版本开始,我们可以通过PreparedStatement.setObjectResultSet.getObject直接与数据库交换 java.time 对象。因此,使用这些智能对象而不仅仅是字符串来传递日期时间值。

java.time 类以标准ISO 8601格式生成字符串。只需致电toString

String output = instant.toString() ;
String output = ldt.toString() ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore