我知道如何以毫秒检索时间戳:
to_char(systimestamp ,'YYYY-MM-DD HH24:MI:SS,FF9')
有人可以建议,时间戳数据类型是否足以以毫秒存储日期或者我可以使用varchar2吗?我试图从Java中插入这个值。
答案 0 :(得分:2)
是的,如果你需要,TIMESTAMP
可以将精度降低到几纳秒。
如果您只需要毫秒,则只需要一个TIMESTAMP(3)
列。
在Java端使用java.sql.Timestamp
(如果需要,可再次降至纳秒)。请注意,如果可能,您应该避免进行to_char
转换 - 执行客户端需要的任何字符串转换;将数据作为时间戳获取,并将其作为时间戳发送。
答案 1 :(得分:0)
使用智能对象,而不是愚蠢的字符串。使用 java.time 进行纳秒分辨率。
myResultSet.getObject( … , LocalDateTime.class )
Answer by Jon Skeet是正确的,但现在过时了。 java.sql.Timestamp
类被 java.time 类取代,例如Instant
和LocalDateTime
。
java.time 类的分辨率为纳秒,足以达到毫秒级。
Oracle数据库seems to have a TIMESTAMP
type,它等同于SQL标准类型TIMESTAMP WITHOUT TIME ZONE
。这意味着它缺乏time zone或offset-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.setObject
和ResultSet.getObject
直接与数据库交换 java.time 对象。因此,使用这些智能对象而不仅仅是字符串来传递日期时间值。
java.time 类以标准ISO 8601格式生成字符串。只需致电toString
。
String output = instant.toString() ;
String output = ldt.toString() ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。