java - 使用 JDBC 客户端获取 MySQL 时间数据类型的问题

标签 java mysql jdbc

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: Bad format for Time '838:59:59' in column 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc.ResultSetRow.getTimeFast(ResultSetRow.java:949) at com.mysql.jdbc.ByteArrayRow.getTimeFast(ByteArrayRow.java:226) at com.mysql.jdbc.ResultSetImpl.getTimeInternal(ResultSetImpl.java:6050) at com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5784) at com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5819) at 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: Bad format for Time '838:59:59' in column 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc.ResultSetImpl.getTimeFromString(ResultSetImpl.java:5975) at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5723) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610) at com.impetus.idw.blend.utils.JDBCUtil.main(JDBCUtil.java:37)

如何获取时间字段?我在这里缺少什么?

最佳答案

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 列一样检索它。

关于java - 使用 JDBC 客户端获取 MySQL 时间数据类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874542/

相关文章:

java - 我们可以在一个项目中同时使用Java Spring mvc和Spring Boot吗?

java - Solr 空间距离错误

java - Chronicle Queue : blockSize, 索引计数和大小指导

mysql - 查询过去一小时内修改过的表

java - 逐渐填充InputStream并用SpringMVC返回

java - 由于底层异常导致 MySQL 通信链接失败

java - 使用 Stanford CoreNLP 的共指解析

javascript - 如何在javascript客户端中将日期作为字符串输入,传递到python服务器,并在myql中存储为日期时间?

mysql - 错误 1148 : The used command is not allowed with this MySQL version

oracle - 将 SQL 解析为 Oracle JDBC 驱动程序