【发布时间】:2013-12-06 16:35:25
【问题描述】:
我正在编写一个小导入例程来插入来自 excel 的测量数据以进行访问。在我的 excel 输入文件中,我得到了每小时忽略时间更改为夏令时的值,因此每个日期都将比前一个日期晚 1 小时。没有重复,没有丢失的日期。
现在我使用 poi 读取数据,然后尝试使用准备好的语句将数据批量插入 Access 数据库。但是我在执行批处理时总是遇到一般错误。查看数据库,我看到在“2011.03.27 01:00”之前插入的所有数据,但插入的下一个和最后一个日期是“2011.03.27 03:00”,其值对应于我的输入数据中的“2011.03.27 02:00” .
不知何故,在插入数据时,日期“2011.03.27 02:00”被隐式转换为“2011.03.27 03:00”(没有警告或错误),并且由于我的日期列被标记为主键,插入失败时试图插入真正的 3'o'clock 数据。
有什么方法可以防止这种转换发生吗?我知道日期“2011.03.27 02:00”不存在(或至少等于“2011.03.27 03:00”),但为了数据的一致性,我需要正确插入此日期。
这是我的代码:
myDBConn = DriverManager.getConnection("jdbc:odbc:mydb");
state = myDBConn.prepareStatement("Insert into myTable values(?,?,?)");
for(int i=0;i<numberOfObjects;i++){
state.clearBatch();
for(int j=0;j<numberOfHours;j++){
state.setString(1,names[i]);
state.setTimestamp(2,dates[j]);
state.setDouble(3, data[i][j]);
state.addBatch();
}
state.executeBatch();
}
state.close();
myConn.close();
我已经确保 dates[] 包含正确的日期并且没有重复。执行批处理时似乎确实发生了转换...
【问题讨论】:
-
您可能不应该以特定于时区的格式存储,使用 UTC 之类的格式更合适,因为它是通用的,并且不会受到夏令时等因素的影响。见:stackoverflow.com/questions/2532729/…
-
我想尝试一下,但是我应该以哪种格式存储日期?我不能在批量插入语句中使用 joda.DateTime,因为它只接受日期或时间戳。有没有办法在java中创建一个非时区特定的日期或时间戳?
标签: java sql date ms-access bulkinsert