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)
- 这是一个类似问题的答案,我希望它可以帮助Oracle比较时间戳
-
截断无法解决问题,因为我需要确保返回的唯一行是在一小时前创建的。
-
答案是肯定的:TIMESTAMP WITH TIME ZONE值的所有运算和比较都是在UTC时间内部完成的,即,它们被隐式转换以进行计算。
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。
在开始和结束时都执行此操作。将这些java.sql.Timestamp对象传递到您的PreparedStatement。
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧版旧式日期时间类,例如java.util.Date,Calendar,