Value '0000-00-00' can not be represented as java.sql.Date

本文介绍了一种在Java应用程序中处理MySQL特殊日期值导致的SQLException的方法。通过在JDBC连接字符串中设置zeroDateTimeBehavior参数来避免错误,并给出了正确的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

问题描述,在java应用程序中,数据表中有记录的time字段(属性为timestamp)其值为:“0000-00-00 00:00:00”

程序使用select 语句从中取数据时出现以下异常:

java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date

 

这是因为 “0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的,但是在Java中, java.sql.Date 会被视为 不合法的值,被JVM认为格式不正确。

 

解决办法:

 

 

在jdbc的url加上   zeroDateTimeBehavior参数:

datasource.url=jdbc:mysql://localhost:3306/pe?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull


对于值为0000-00-00   00:00:00(默认值)的纪录,根据不同的配置,会返回不同的结果:
不配置:默认返回异常
zeroDateTimeBehavior=round   0001-01-01   00:00:00.0

zeroDateTimeBehavior=convertToNull   null

 

这样有可能会报新的Exception:

The reference to entity "characterEncoding" must end with the ';' delimiter  

其原因可能是在Properties文件或者xml文件中忘记进行特殊符号的转译了,

jdbc:mysql://192.168.1.155:3306/diandi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

需要改为:

jdbc:mysql://192.168.1.155:3306/diandi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

 

有以下几类字符要进行转义替换:

 

 

 

<

 

<

 

小于号

 

&gt;

 

>

 

大于号

 

&amp;

 

&

 

 

&apos;

 

'

 

单引号

 

&quot;

 

"

 

双引号

 

 

 

### 将 SQL 中的字符串类型转换为日期时间类型进行查询 在 SQL 查询中,将字符串类型转换为日期时间类型是一项常见需求。不同的数据库管理系统(DBMS)提供了各自的函数来完成这一任务。以下是针对主流 DBMS 的解决方案。 #### 1. **MySQL** 在 MySQL 中,可以使用 `STR_TO_DATE()` 函数将字符串转换为日期时间格式[^3]。该函数的第一个参数是要转换的字符串,第二个参数是指定输入字符串的时间格式模板。 ```sql SELECT STR_TO_DATE('2023-10-05', '%Y-%m-%d') AS date_value; ``` 如果目标列存储的是带有时间戳的字符串,则可以扩展模板以匹配完整的日期时间模式: ```sql SELECT STR_TO_DATE('2023-10-05 14:30:00', '%Y-%m-%d %H:%i:%s') AS datetime_value; ``` #### 2. **PostgreSQL** PostgreSQL 提供了更直观的方法&mdash;&mdash;通过强制类型转换或将字符串解析为目标数据类型。可以直接使用 `::timestamp` 或者 `CAST()` 函数来进行转换[^4]。 ```sql SELECT '2023-10-05'::date AS date_value; SELECT CAST('2023-10-05 14:30:00' AS timestamp) AS datetime_value; ``` #### 3. **SQL Server** 在 SQL Server 中,推荐使用 `CONVERT()` 或 `TRY_CONVERT()` 函数处理字符串到日期时间类型的转换。后者能够更好地应对无效日期的情况而不抛出错误[^5]。 ```sql SELECT CONVERT(DATETIME, '2023-10-05 14:30:00', 120) AS datetime_value; SELECT TRY_CONVERT(DATETIME, 'invalid-date-string') AS safe_conversion_result; ``` #### 4. **Oracle Database** 对于 Oracle 数据库而言,应采用 `TO_DATE()` 或 `TO_TIMESTAMP()` 函数依据指定格式模型执行转换操作[^6]。 ```sql SELECT TO_DATE('2023-10-05', 'YYYY-MM-DD') FROM dual; SELECT TO_TIMESTAMP('2023-10-05 14:30:00', 'YYYY-MM-DD HH24:MI:SS') FROM dual; ``` #### 处理时区问题 当涉及跨时区的操作时,需特别注意设置正确的时区上下文。例如,在 Druid 中可通过调整连接参数 `"sqlTimeZone"` 来改变默认使用的 UTC 时间标准[^7]。而在 PostgreSQL 中则可以通过修改会话级别的配置项达成相同效果: ```sql SET timezone='Asia/Shanghai'; ``` 另外值得注意的一点是,某些旧版系统可能存在无法识别零年份的问题,这通常表现为类似于 `'0000-00-00 00:00:00' cannot be represented as java.sql.Timestamp` 的异常提示[^8]。对此类情况的最佳实践建议是从源头杜绝此类非法值的存在或者提前做好预处理工作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值