关于java:Oracle数据库能够比较不同时区的时间戳吗?

Is Oracle db able to compare timestamps with different timezones?

我想知道Oracle是否能够比较不同时区的日期,如:

2016/12/26 3:58:16.491476 AM -06:00> 2016/12/26 3:58:16.491476 AM 05:00

顺便说一句,我正在使用JPA进行此比较,其目的是查找一个小时前创建的所有行。

我发现我可以使用After关键字来查找它(即findMeasureDateAfter)


n


ISO 8601

首先,如果这些输入实际上是问题中提出的字符串,则尽可能使用标准ISO 8601格式。标准格式对人类而言是直观的,并且更易于由计算机解析。实际上,在解析/生成字符串时,java.time类默认使用ISO 8601格式。

java.time

虽然我不了解Oracle中的查询(我本人是Postgres人),但我可以展示如何在Java方面进一步形成查询。

理想情况下,我们会将输入字符串解析为OffsetDateTime,因为它缺少时区的指示,仅具有相对于UTC的偏移量。区域是一个偏移量以及一组用于处理异常的规则,例如夏令时(DST)。时区以continent/region格式命名,例如America/Montreal

不幸的是,Java 8中的java.time实现在解析DateTimeFormatter类中的offset-from-UTC时存在一些错误。因此,在Java 9之前,这里有一些hack代码可以解析为ZonedDateTime并转换为更合适的OffsetDateTime

1
2
3
String input ="12/26/2016 3:58:16.491476 AM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("MM/dd/uuuu h:m:s.SSSSSS a z" , Locale.ENGLISH );
OffsetDateTime odt = ZonedDateTime.parse ( input , f ).toOffsetDateTime ();

odt.toString(): 2016-12-26T03:58:16.491476-06:00

重复您的结束时刻。

如果JDBC驱动程序支持JDBC 4.2或更高版本,则可以直接通过PreparedStatement::setObject传递这些java.time类型。

如果不是,请转换为java.sql类型。要进行转换,请查看添加到旧类中的新方法。 from方法采用Instant,这是UTC时间轴上的一个时刻。您可以将Instant视为除去其偏移量的OffsetDateTime。调用OffsetDateTime::toInstant提取Instant

1
java.sql.Timestamp ts = java.sql.Timestamp.from( odt.toInstant() ) ;

在开始和结束时都执行此操作。将这些java.sql.Timestamp对象传递到您的PreparedStatement

关于java.time

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