【问题标题】:Where is the date format specified when reading a date as a string from JDBC ResultSet从 JDBC ResultSet 将日期作为字符串读取时指定的日期格式在哪里
【发布时间】:2014-01-14 00:46:06
【问题描述】:

这与Default JDBC date format when reading date as a string from ResultSet 完全相同,但从未真正回答过这个问题;人们只是提供了编写代码的替代方法。

我特意询问是否有人知道默认转换格式是在哪里指定的,以及它是由某个地方的 JDBC 规范定义的,还是由单独的 JDBC 驱动程序定义的。如果是后者,那么还有一个问题,Oracle 10g JDBC 是如何做到这一点的?

** 添加到 1 月 15 日:

抱歉,我认为这个问题已经足够清楚了,但显然不是。我不是试图从数据库中检索日期值,也不需要关于如何做到这一点的建议。

我不认为这是引用问题的重复,这就是为什么我在这里提出一个单独的问题。虽然标题几乎相同,但引用的问题(无论 OP 的意图如何)已经用从数据库中检索日期值的替代方法得到了回答,这不是我想知道的。

干杯,

【问题讨论】:

  • 为什么需要将日期读取为字符串?你想稍后进行任何计算吗?比如比较、子串等。
  • 您可能错过了另一个问题的答案要点……关键是您的问题没有意义。您应该通过 getDate 方法请求 java.sql.Date 对象,而不是请求字符串。 JDBC 驱动程序的真正目的是在数据库引擎和 Java 应用程序之间进行调解,将本地定义的值转换为常见的 Java 对象。对于日期时间值,每个 JDBC 驱动程序的工作是为您提供 java.sql.Date 对象。从那里你可以创建任何你想要的字符串渲染。
  • @Basil,谢谢你,但我觉得可能是你没有抓住重点,并且可能对我想要达到的目标做出了无效的假设。这个问题很有意义:某处有一些将数据库日期值转换为字符串的代码;我只是想知道它是如何确定使用哪种格式的,仅此而已。
  • 不是你想听到的,但似乎应该有一个指向stackoverflow.com/q/19840542/217324的链接

标签: java jdbc


【解决方案1】:

好的,通过 JDBC 代码进行跟踪,看起来 Oracle 驱动程序硬编码了自己的格式:

  int k = (((bytes[0 + j] & 255) - 100) * 100 + (bytes[1 + j] & 255)) - 100;
  String s = k + "-" + toStr(bytes[2 + j])
      + "-" + toStr(bytes[3 + j])
      + " " + toStr(bytes[4 + j] - 1)
      + ":" + toStr(bytes[5 + j] - 1)
      + ":" + toStr(bytes[6 + j] - 1)
      + ".0";

因此,我猜测:

  1. 此行为未在任何 JDBC 规范中指定。
  2. 每个驱动程序库都可以返回它喜欢的任何格式。

我假设这些是因为不同的实现返回不同的格式。当然,这种格式仍然有可能在 JDBC 规范的某个地方被强制要求,并且一些实现不符合要求,但这似乎不太可能。我当然在 JDBC 规范中找不到任何对此的引用(但这并不意味着它们不存在于某个地方!)。

但是,就我而言,关键点是该格式在库中是硬编码的,并且不能被任何环境或其他设置覆盖,而且只要驱动程序库也不会跨系统更改版本保持不变。

【讨论】:

    【解决方案2】:

    Oracle 10g JDBC 是封闭源代码,所以我想我们永远不会知道 :) 但我敢打赌,它首先会向服务器询问语言环境信息,然后根据服务器设置调整将使用的内部数据格式。我的 2c。

    【讨论】:

    • 它是 Java:没有什么是真正的封闭源代码 :)
    【解决方案3】:

    我不能 100% 确定 SQL 日期类型的所有数据库实现。但从Oracle database 的javadoc 看来,Oracle DB 的DATE 似乎可以轻松转换为java.sql.DateMySQLPostgreSQL 也是如此:SQL DATE 可以转换为 java.sql.Date

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2022-07-04
      • 2018-08-30
      相关资源
      最近更新 更多