MySQL版本:5.5.41-0ubuntu10.14.04.1
根据文件,时间的最大值为"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:第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.jjdbc.ResultSetImpl.getTime(ResultSetImpl.java:5784(在com.mysql.jjdbc.ResultSetImpl.getTime(ResultSetImpl.java:5819(网址:com.pumputers.idw.blend.utils.JDBCUtil.main(JDBCUti.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.jjdbc.ResultSetImpl.getTimeFromString(ResultSetImpl.java:5975(网址:com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5723(在com.mysql.jjdbc.ResultSetImpl.getString(ResultSetImpl.java:5570(在com.mysql.jjdbc.ResultSetImpl.getString(ResultSetImpl.java:5610(网址:com.pumputers.idw.blend.utils.JDBCUtil.main(JDBCUti.java:37(
如何获取时间字段?我在这里错过了什么?
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
列一样检索它。
如果您想使用查询获取时间列,可以将查询修改为
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-格式化
Time
变量的格式为:yyyy-MM-dd hh:MM:ss。这与SQL数据库存储的内容不同,因此当您尝试将time
初始化为所选时间时,它可能不兼容。医生说:
MySQL检索并显示"HH:MM:SS"格式的TIME值(对于大小时值,则为"HHH:MM:SS(。
由于有不同的格式,time
变量不会被初始化。
你可以试试这个:将从数据库中检索到的时间存储为String
。然后使用以下链接的答案查询