JDBC和Oracle数据库时区处理



我已经在Oracle DB中创建了

的示例表
"CREATED_ON" TIMESTAMP (6), 
"CREATED_ON_TIMEZONE" TIMESTAMP (6) WITH TIME ZONE, 
"TIMEZONE_GMT" TIMESTAMP (6) WITH TIME ZONE

和java的插入值如下

preparedStatement.setTimestamp(1, new Timestamp(new Date().getTime()));
preparedStatement.setTimestamp(2, new Timestamp(new Date().getTime()));
preparedStatement.setTimestamp(3, new Timestamp(new Date().getTime()) ,Calendar.getInstance(TimeZone.getTimeZone("UTC")));

亚洲/加尔各答的JVM时区。我已经使用SQL开发人员查询数据。我只是想清除我的理解

  1. 第一列根据没有时区的本地JVM存储了值,因为数据类型仅是时间戳,即 29-NOV-17 07.04.28.014000000 pm 。因此,适用于Timstamp Datatype DB存储的列,如本地JVM,该列是由JDBC驱动程序传递的本地JVM,并且没有发生JDBC侧或DB侧的转换?

  2. 第二列存储带有时区的值,即 29-NOV-17 07.04.28.014000000 pm亚洲/加尔各答。因此,这是指列的DB存储价值带有JDBC驱动程序提供的时区信息,并且在DB侧没有响应?

  3. 我想将值存储在GMT中,因此我将第三个参数设置为GMT,它将其存储在GMT中,但TimeZone仍在本地JVM处显示。I.E 29-NOV-17 01.34.28.014000000 pm Asia/calcutta

我在下面引用了文章,但我的观察结果看起来完全不同。http://brian.pontarelli.com/2011/08/16/database andling-for-timezones/

问题是Java Timestamp不包含任何时区信息。

因此,您将TIMESTAMP值插入TIMESTAMP WITH TIME ZONE的列中。在这种情况下

FROM_TZ(<your value>, SESSIONTIMEZONE)

命令preparedStatement.setTimestamp(3, new Timestamp(new Date().getTime()) ,Calendar.getInstance(TimeZone.getTimeZone("UTC")));仅在ALTER SESSION SET TIME_ZONE = 'UTC';

之后才是正确的

最新更新