首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JDBC客户端获取MySQL的时间数据类型时的问题

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

Stack Overflow用户
提问于 2016-08-10 13:14:39
回答 3查看 981关注 0票数 1

MySQL版本:5.5.41-0ubuntu0.14.04.1

根据文档,时间的最大值是"838:59:59“。

我将此值插入名为table01的表中,该表具有1 Time列col_time。

我尝试使用Java代码获取它:

代码语言:javascript
复制
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();
        }

    }
}

我有例外:

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)第1栏中的“838:59:59”在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 的限制。

然后,我使用以下方法将其取为字符串

代码语言:javascript
复制
while (rs.next()) {
        String time = rs.getString("col_time");
        System.out.print("col_time : " + time);
    }

我有例外:

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)第1栏中的“838:59:59”在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)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 15:28:43

MySQL JDBC驱动程序的文档表示时间字段总是被转换为java.sql.Time。查看源代码就会发现,这确实是正确的--即使您调用getString(),它也首先以Time的形式检索数据,然后给出它的字符串表示形式。

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

代码语言:javascript
复制
SELECT CAST( col_time AS char ) AS col_time_str
FROM table01

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

Mysql将为您将时间字段转换为字符串,您将能够像执行任何CHAR或VARCHAR列一样检索它。

票数 3
EN

Stack Overflow用户

发布于 2016-08-10 14:30:53

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

代码语言:javascript
复制
String sql = "select TIME_FORMAT(col_time,'%H:%i:%i') as col_time from table01;";

在这个查询中,使用mysql特定的TIME_FORMAT()函数,它将根据传递的格式格式化col_time。有关此日期时间函数和类似日期时间函数的详细信息,请参阅时间格式。

票数 1
EN

Stack Overflow用户

发布于 2016-08-10 13:38:31

Time变量的格式是:yyyy:mm:ss。这与SQL数据库存储的内容不同,所以当您尝试将time初始化为选定的时间时,它可能是不兼容的。医生说:

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

因为有不同的格式,所以您的time变量不会被初始化。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38874542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档