You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot测试中HSQLDB插入ZonedDateTime报无效日期格式异常求助

问题描述

在运行SpringBoot项目测试时,通过@Sql({"mysqlfile.sql"})指定测试前执行的SQL文件,其中插入语句包含:

insert into tableA( id, ..., changetime,...) values
('cdc1360e-390f-442b-9e61-c5659d3a56b4',...,'2022-01-01T15:00:00Z',...),

实体类对应属性为:

ZonedDateTime changetime,

测试使用HSQLDB数据库,执行时抛出异常:

Caused by: org.hsqldb.HsqlException: data exception: invalid datetime format
解决方法
  • 调整SQL时间格式为HSQLDB兼容格式
    HSQLDB对带时区的时间字符串解析规则与MySQL不同,将原SQL中的'2022-01-01T15:00:00Z'替换为'2022-01-01T15:00:00+00:00'(标准带偏移的ISO格式),或者'2022-01-01 15:00:00 UTC',HSQLDB就能正确解析。修改后的示例:
insert into tableA( id, ..., changetime,...) values
('cdc1360e-390f-442b-9e61-c5659d3a56b4',...,'2022-01-01T15:00:00+00:00',...),
  • 配置HSQLDB启用格式兼容
    在测试环境的数据源URL中添加日期格式参数和MySQL语法兼容开关,让HSQLDB识别原有的时间格式。在application-test.properties中配置:
spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true;datetime_format='yyyy-MM-dd''T''HH:mm:ss''Z'''

sql.syntax_mys=true开启MySQL语法兼容,datetime_format指定解析时间时使用的格式模板。

  • 确认数据库字段类型匹配
    检查tableA的changetime字段类型是否为TIMESTAMP WITH TIME ZONE,如果是普通TIMESTAMP类型,HSQLDB无法处理带时区的时间值,需要将字段类型修改为TIMESTAMP WITH TIME ZONE。

  • 脚本预处理转换时间(可选)
    如果不想修改原始SQL文件,可以自定义SQL执行监听器,在脚本执行前将Z结尾的时间字符串替换为HSQLDB支持的格式。比如实现SqlScriptExecutionListener接口,在beforeScriptExecution阶段处理SQL内容。

内容的提问来源于stack exchange,提问作者user13904118

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:26