我四处搜寻,令人惊讶地找不到Oracle
JDBC的答案。这个密切相关的问题为PostgreSQL和MySQL提供了答案。
基本上,如果我在两个不同的时区中有两个应用服务器,将时间戳写入一个Oracle数据库,将会发生什么?谢谢。
编辑:我应该补充一点,当我执行查询时,似乎JDBC发送给数据库的值在我的本地时区。
我整理了一些测试JDBC代码以弄清楚到底发生了什么。结果很有趣。Oracle有三个密切相关的数据类型:TIMESTAMP
,TIMESTAMP WITH TIME ZONE
,和TIMESTAMP WITH LOCAL TIME ZONE
。我采用了完全相同的代码,并从两个不同的框中运行它,一个在“
America / New_York”时区,另一个在UTC上运行。两者都命中相同的数据库,并以UTC运行。我正在使用Oracle
11.2.0.2.0驱动程序。
TIMESTAMP
列设置为执行Java代码的计算机上的本地时间。没有执行时区转换。TIMESTAMP WITH TIME ZONE
列将时间转换为JDBC客户端所在的任何时区。TIMESTAMP WITH LOCAL TIME ZONE
列还将时间转换为JDBC客户端所在的时区。这篇文章比较旧,表明TIMESTAMP WITH TIME ZONE
如果您要执行诸如索引或分区之类的操作,这几乎没有用。但是,这似乎TIMESTAMP WITH LOCAL TIME ZONE
非常有用。(不知道如果更改服务器的时区会发生什么,但是对于JDBC客户端的本地时区来说似乎很明智)。我还没有机会用这些数据类型测试索引行为等。
如果您想在您的环境中重现我的测试,请在下面粘贴我的示例类。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Date;
// create table x_tst_ts_tab(
// os_name varchar(256)
// ts timestamp,
// ts_with_tz timestamp with time zone,
// ts_with_local_tz timestamp with local time zone
// )
class TSTest {
public static final void main(String[] argv) throws Exception {
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection(
"your_connection_string",
"your_user_name",
"your_password");
try {
// Insert some data
Date nowDate = new Date();
Timestamp nowTimestamp = new Timestamp(nowDate.getTime());
PreparedStatement insertStmt = conn.prepareStatement(
"INSERT INTO x_tst_ts_tab"
+ " (os_name, ts, ts_with_tz, ts_with_local_tz)"
+ " VALUES (?, ?, ?, ?)");
try {
insertStmt.setString(1, System.getProperty("os.name"));
insertStmt.setTimestamp(2, nowTimestamp);
insertStmt.setTimestamp(3, nowTimestamp);
insertStmt.setTimestamp(4, nowTimestamp);
insertStmt.executeUpdate();
} finally {
try {
insertStmt.close();
} catch (Throwable t) {
// do nothing
}
}
System.out.println("os_name, ts, ts_with_tz, ts_with_local_tz");
// Read back everything in the DB
PreparedStatement selectStmt = conn.prepareStatement(
"SELECT os_name, ts, ts_with_tz, ts_with_local_tz"
+ " FROM dom_fraud_beacon.x_tst_ts_tab");
ResultSet result = null;
try {
result = selectStmt.executeQuery();
while (result.next()) {
System.out.println(
String.format("%s,%s,%s,%s",
result.getString(1),
result.getTimestamp(2).toString(),
result.getTimestamp(3).toString(),
result.getTimestamp(4).toString()
));
}
} finally {
try {
result.close();
} catch (Throwable t) {
// do nothing
} finally {
try {
selectStmt.close();
} catch (Throwable t) {
// do nothing
}
}
}
} finally {
try {
conn.close();
} catch (Throwable t) {
// do nothing
}
}
}
}
问题内容: 在将Java Date写入SQL TIMESTAMP列之前,JDBC是否将日期从Java虚拟机时区转换为数据库会话的日期? 例如,假设Java虚拟机时区为UTC,数据库会话时区为UTC-5。如果Java程序根据JDBC标准尝试通过将其传递给来进行存储,则数据库将存储还是? 问题答案: 不,JDBC只是有关客户端如何访问数据库的API。对于时间戳存储,这将必须由编写符合JDBC API标
问题内容: 过去几个小时以来,我一直在网上搜索以获取系统时区中的日期时间。 当我使用calendar.getTimezone.getDefaultName时,它总是返回我格林尼治标准时间。(理想情况下,它应该返回我当前的时区,即IST)。我正在尝试将此字符串(“格林尼治标准时间”)“ 2014-02-14T06:04:00:00”转换为我的时区datetime。它总是在格林尼治标准时间同时返回我。
我是Gradle项目的新手,我有一个问题。我在网上搜索过,但找不到我需要的东西,或者我不知道如何搜索。首先我要告诉你我的情况。我有一个Gradle项目,我想在将来与jenkins一起执行几个自动化测试,但现在我想在Eclipse上进行尝试。我在/lib目录中有oracle jdbc驱动程序,这是我的构建。格拉德尔 我想在一个类中使用这个jdbc驱动程序,但我不知道如何使用它。当我尝试使用Maven
问题内容: 当Hibernate 将 Java 对象 写入 SQL 列时,它将日期,计算机日期或日历对象(或其他日期)中指定的日期调整到哪个时区? 当Hibernate 读 的到日历对象,以哪个时区并把它翻译的日期? 问题答案: 当Hibernate将Java Calendar对象写入SQL TIMESTAMP列时,它将日期,计算机日期或Calendar对象(或其他日期)中指定的日期调整到哪个时区
我的错误是:org.openqa.selenium.sessionNotCreatedException:会话未从超时创建:从呈现程序接收消息超时:600.000(会话信息:Chrome=79.0.3945.130)构建信息:版本:“3.141.59”,修订:“E82BE7D358”,时间:“2018-11-14T08:17:03”系统信息:主机:“swati-*con-mac”,IP:“fe80
编程时,工作流程如下: 更改文件并保存。 编译器或解释器。 看看结果 但是也有一个工作流程是这样的:(实际上它类似于处理我正在输入的这个堆栈溢出问题窗口) 启动一个程序,监视文件目录的更改。 我在寻找第二个工作流程通常被称为什么。