jjzjj

java - OJBC 客户端升级后更改了 java.sql.Date 的行为

coder 2024-03-13 原文

将 OJDBC 客户端从版本 11.2.0 升级到 12.1.0 后,我在将 java.sql.Date 对象绑定(bind)到 PreparedStatement 时遇到了不同的行为。

在预处理语句中,宿主变量“f.plan_date = ?”应该与 java.util.Date 对象的值绑定(bind),作为在代码其他地方获得的输入。 Oracle 表中的列数据类型是“DATE”,只应考虑日期部分 - 时间无关紧要。

我按以下方式将 java.util.Date 对象翻译成 java.sql.Date 对象: statementRegisterJobs.setDate(3, new java.sql.Date(planDate.getTime()));

这适用于 11.2.0 客户端。但是,升级到 12.1.0 后,事情往往会出错。不再检索任何记录。经过几个小时的调试,我发现问题与日期变量有关。以下工作方式让我恢复了记录: statementRegisterJobs.setDate(3, java.sql.Date.valueOf("2014-08-21"));

有人可以澄清这种行为吗? java.util.Date 对象最终可以有一个时间组件,我有一种不确定的感觉,这可能与问题有某种关系。另一方面,以下项目应该证明在 java.sql.Date 中忽略了时间组件,无论对象是如何构造的......

  • 在 java.sql.Date 的 Java 6 API 中,我发现了以下语句:“此方法已弃用,不应使用,因为 SQL 日期值没有时间部分。” (方法“getHours()”)。因此,这意味着在将 java.util.Date 转换为 java.sql.Date 时忽略时间方面。
  • 构造函数文档中的信息证实了这一点:“使用给定的毫秒时间值构造一个 Date 对象。如果给定的毫秒值包含时间信息,则驱动程序会将时间组件设置为默认时区中的时间(运行应用程序的 Java 虚拟机的时区)对应零 GMT。”
  • 此外,我无法从 java.sql.Date 对象中获取可能的时间方面:toString() 只给我日期,getHours() 抛出异常。
  • 这与 JDBC 客户端中的更新有什么关系?

如有任何想法,我们将不胜感激 :) 在此先感谢您。

最佳答案

与 Java API 的声明相反,当通过传递毫秒时间值创建 java.sql.Date 对象时,时间方面似乎存储在对象中,并且在使用 12.1.0 OJDBC 驱动程序时不默认为零.

这是我设置的测试:

java.util.Date utilDate = new Date();
java.sql.Date sqlDate1 = new java.sql.Date(utilDate.getTime());
java.sql.Date sqlDate2 = java.sql.Date.valueOf("2014-08-27");

我准备了以下语句(SELECT to_char(?, 'YYYY-MM-DD HH24:MI:SS') testDate FROM dual),绑定(bind)了 sqlDate1 和 sqlDate2 并得到了以下结果。

  1. 使用驱动程序版本 11.2.0

    • sqlDate1:​​2014-08-27 00:00:00
    • sqlDate2:2014-08-27 00:00:00
  2. 使用驱动程序版本 12.1.0

    • sqlDate1:​​2014-08-27 14:47:29
    • sqlDate2:2014-08-27 00:00:00

这与API中的文档不符:

If the given milliseconds value contains time information, the driver will set the time components to the time in the default time zone (the time zone of the Java virtual machine running the application) that corresponds to zero GMT.

但是,知道这一点后,我可以通过将 sql 日期对象的时间信息强制为午夜来解决这个问题。

关于java - OJBC 客户端升级后更改了 java.sql.Date 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450452/

有关java - OJBC 客户端升级后更改了 java.sql.Date 的行为的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  8. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

随机推荐