问题在使用JDBC客户
MySQL版本获取的MySQL的时间数据类型:5.5.41-0ubuntu0.14.04.1问题在使用JDBC客户
按照该docs,时间的最大值为“838:59: 59"
我插入表中这个值命名为table01
有1周时间列col_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: ':59:59 838' 在列时间的格式错误1 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 在com.mysql.jdbc.SQLError.createSQLException(的SQLError .java:982) at com.mysql.jdbc.SQLErro r.createSQLException(SQLError.java:927) 在com.mysql.jdbc.ResultSetRow.getTimeFast(ResultSetRow.java:949) 在com.mysql.jdbc.ByteArrayRow.getTimeFast(ByteArrayRow.java:226) 在融为一体。 mysql.jdbc.ResultSetImpl.getTimeInternal(ResultSetImpl.java:6050) 在com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5784) 在com.mysql.jdbc.ResultSetImpl.getTime(ResultSetImpl.java:5819) (JDBCUtil.java:34) 在com.impetus.idw.blend.utils.JDBCUtil.main
这是预期为超过java.sql.Time
然后我用
while (rs.next()) { String time = rs.getString("col_time");
System.out.print("col_time : " + time);
}
获取它作为字符串我得到异常:
值java.sql.SQLException:坏格式时间 '838:59:59' 列1 在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) 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) 在com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610) 在com.impetus.idw.blend.utils.JDBCUtil.main(JDBCUtil.java:37)
如何我可以取时间字段?我在这里错过了什么?
回答:
的documentation for the MySQL JDBC driver表示时间字段总是转化为java.sql.Time
。查看源代码可以看出这确实如此 - 即使您调用getString()
,它也会先检索数据为Time
,然后为您提供其字符串表示形式。
您的解决方案应该是在数据库获取它之前让数据库将时间值转换为字符串。也就是说,而不是仅仅使用SELECT *
,使用
SELECT CAST(col_time AS char) AS col_time_str FROM table01
然后用rs.getString("col_time_str")
。
Mysql会将时间字段转换为一个字符串,您可以像检索任何CHAR
或VARCHAR
列那样检索它。
回答:
变量Time
的格式为:yyyy-MM-dd hh:mm:ss。这与SQL数据库存储的不同,所以当您尝试将time
初始化为选定时间时,它可能不兼容。该文档说:
MySQL检索并显示时间值的'HH:MM:SS'格式(或'HHH:MM:SS'格式为大时间值)。
由于存在不同的格式,因此您的time
变量不会被初始化。
您可以尝试的是: 将检索到的时间从数据库中存储为String
。然后使用下面的链接的答案CHA
回答:
如果你想使用查询来获取时间列,您可以修改查询作为
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
以上是 问题在使用JDBC客户 的全部内容, 来源链接: utcz.com/qa/264797.html