【问题标题】:Issue in fetching Time data type of MySQL using JDBC client使用 JDBC 客户端获取 MySQL 时间数据类型的问题
【发布时间】:2016-08-10 13:14:39
【问题描述】:

MySQL 版本:5.5.41-0ubuntu0.14.04.1


根据docs,Time 的最大值为“838:59:59”

我将此值插入到名为 table01 的表中,该表有 1 个 Timecol_time

我尝试使用 Java JDBC 代码获取此内容:

public class JDBCUtil {

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://xx.xx.xx.xx:3306/testdb";

    static final String USER = "root";
    static final String PASS = "root";

    public static void main(String[] args) {

        try {
            Class.forName(JDBC_DRIVER);

        } catch (ClassNotFoundException ce) {
            ce.printStackTrace();
        }

        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                Statement stmt = conn.createStatement();) {

            String sql = "select * from table01;";
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                Time time = rs.getTime("col_time");
                System.out.print("col_time : " + time);

            }
            rs.close();

        } catch (SQLException se) {
            se.printStackTrace();
        }

    }
}

我遇到了异常:

java.sql.SQLException:第 1 列中时间“838:59:59”的格式错误 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 在 com.mysql.jdbc.ResultSetRow.getTimeFast(ResultSetRow.java:949) 在 com.mysql.jdbc.ByteArrayRow.getTimeFast(ByteArrayRow.java:226) 在 com.mysql.jdbc.ResultSetImpl.getTimeInternal(ResultSetImpl.java:6050) 在 com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5784) 在 com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5819) 在 com.impetus.idw.blend.utils.JDBCUtil.main(JDBCUtil.java:34)

这超出了java.sql.Time的限制

然后我使用

将其作为字符串提取
while (rs.next()) {
        String time = rs.getString("col_time");
        System.out.print("col_time : " + time);
    }

我遇到了异常:

java.sql.SQLException:第 1 列中时间“838:59:59”的格式错误 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 在 com.mysql.jdbc.ResultSetImpl.getTimeFromString(ResultSetImpl.java:5975) 在 com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5723) 在 com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) 在 com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610) 在 com.impetus.idw.blend.utils.JDBCUtil.main(JDBCUtil.java:37)

如何获取 时间 字段?我在这里错过了什么?

【问题讨论】:

标签: java mysql jdbc


【解决方案1】:

documentation for the MySQL JDBC driver 表示 TIME 字段总是转换为 java.sql.Time。看一下源代码,这确实是真的——即使你调用getString(),它首先会以Time 检索数据,然后给你它的字符串表示形式。

您的解决方案应该是让数据库在获取时间值之前将其转换为字符串。也就是说,不要只使用SELECT *,而是使用

SELECT CAST( col_time AS char ) AS col_time_str
FROM table01

然后使用rs.getString("col_time_str")

Mysql 将为您将时间字段转换为字符串,您将能够像在任何 CHARVARCHAR 列中一样检索它。

【讨论】:

    【解决方案2】:

    如果要使用查询获取时间列,可以将查询修改为

    String sql = "select TIME_FORMAT(col_time,'%H:%i:%i') as col_time from table01;";
    

    在这个查询中,使用了 mysql 特定的 TIME_FORMAT() 函数,它将根据传递的格式格式化 col_time。有关此功能和类似日期时间功能的更多信息,请参阅https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_time-format

    【讨论】:

      【解决方案3】:

      Time 变量的格式为:yyyy-MM-dd hh:mm:ss。这与 SQL 数据库存储的内容不同,因此当您尝试将 time 初始化为选定时间时,它可能不兼容。文档说:

      MySQL 以“HH:MM:SS”格式(或“HHH:MM:SS”格式用于大小时值)检索和显示 TIME 值。

      由于有不同的格式,您的 time 变量不会被初始化。

      你可以尝试的是: 将从数据库中检索到的时间存储为String。然后使用下面链接的答案来查

      【讨论】:

      • 我想你还没有阅读java.sql.Time的文档。此外,可能还没有读过这个问题,因为 OP 询问为什么使用 getString() 会给他一个关于时间格式的例外。
      猜你喜欢
      • 2016-12-14
      • 1970-01-01
      • 2020-10-27
      • 2022-12-08
      • 1970-01-01
      • 2019-05-19
      • 2020-08-16
      • 1970-01-01
      • 2018-09-08
      相关资源
      最近更新 更多