'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error

本文介绍了一种常见的数据库操作错误——无法将'0000-00-00 00:00:00'解析为Java Timestamp类型的问题及其解决方案。通过在JDBC连接字符串中添加参数'zeroDateTimeBehavior=convertToNull'来避免此类异常。
### Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
; SQL []; Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp; nested exception is java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
org.springframework.dao.TransientDataAccessResourceException: 
### Error querying database.  Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

 

最简单的解决办法:

在jdbc的连接中增加:zeroDateTimeBehavior=convertToNull

`Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp` 这个错误通常在从数据库中读取日期时间值 `'0000-00-00 00:00:00'` 并尝试将其转换为 `java.sql.Timestamp` 对象时出现,因为 `java.sql.Timestamp` 不能表示这样的零值日期。以下是几种解决该问题的方法: #### 方法一:在 JDBC URL 中设置零日期转换选项 在 JDBC URL 中添加 `zeroDateTimeBehavior` 参数,将其值设置为 `convertToNull` 或 `round`。当设置为 `convertToNull` 时,`'0000-00-00 00:00:00'` 会被转换为 `null`;设置为 `round` 时,会将其转换为一个接近的有效日期。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) { try { // JDBC URL 中添加 zeroDateTimeBehavior 参数 String url = "jdbc:mysql://localhost:3306/your_database?zeroDateTimeBehavior=convertToNull"; String user = "your_username"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT your_date_column FROM your_table"); while (rs.next()) { java.sql.Timestamp timestamp = rs.getTimestamp("your_date_column"); if (timestamp != null) { // 处理有效的时间戳 System.out.println(timestamp); } else { // 处理 null 值 System.out.println("Date is null"); } } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 方法二:在数据库层面处理零值日期 可以在数据库中更新所有 `'0000-00-00 00:00:00'` 的值为一个有效的日期,例如 `'1970-01-01 00:00:00'`。 ```sql UPDATE your_table SET your_date_column = '1970-01-01 00:00:00' WHERE your_date_column = '0000-00-00 00:00:00'; ``` #### 方法三:在 Java 代码中手动处理 在从 `ResultSet` 中获取日期时间值时,先将其作为字符串读取,然后检查是否为 `'0000-00-00 00:00:00'`,如果是则进行特殊处理。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; public class Main { public static void main(String[] args) { try { String url = "jdbc:mysql://localhost:3306/your_database"; String user = "your_username"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT your_date_column FROM your_table"); while (rs.next()) { String dateStr = rs.getString("your_date_column"); if ("0000-00-00 00:00:00".equals(dateStr)) { // 处理零值日期 System.out.println("Zero date found"); } else { Timestamp timestamp = Timestamp.valueOf(dateStr); System.out.println(timestamp); } } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值