H2数据库插入含指定时间的日期报错,求排查原因
问题出在哪?我来给你拆解
这个问题我之前帮别人排查过,本质是H2数据库对日期、时间类型的运算规则有严格限制:
你写的 current_date -2 + time '23:00' 里,CURRENT_DATE 是纯日期类型(只有年月日,没有时分秒),TIME '23:00' 是纯时间类型(只有时分秒,没有日期)。H2不支持直接把这两种类型做加法来生成带时间的日期,所以它没法解析这个表达式,才抛出了“无法解析常量”的错误。
两种靠谱的解决办法
根据你的需求(当前日期减2天的23:00),给你两种直接能用的写法:
方法1:用TIMESTAMP()函数合并日期和时间
这是H2官方推荐的方式,专门用来把DATE和TIME组合成带完整时间戳的类型:
INSERT INTO PUBLIC.PROJECT( ID, LIBELLE, DESCRIPTION, STATUT, DATE_CREATION, DATE_MODIFICATION, USER_CREATEUR_ID, REFERENT_ID, DATE_DEBUT, DATE_FIN, TYPE, STATUT_PROJET ) VALUES ( 25001, 'Projet 1', NULL, 'INITIEE', CURRENT_DATE, CURRENT_DATE, NULL, 3, TIMESTAMP(CURRENT_DATE - 2, TIME '23:00'), -- 修改后的核心部分 CURRENT_DATE, NULL, NULL );
方法2:拼接字符串后解析成时间戳
如果你更习惯字符串操作的思路,也可以先拼接日期和时间字符串,再转成时间戳:
INSERT INTO PUBLIC.PROJECT( ID, LIBELLE, DESCRIPTION, STATUT, DATE_CREATION, DATE_MODIFICATION, USER_CREATEUR_ID, REFERENT_ID, DATE_DEBUT, DATE_FIN, TYPE, STATUT_PROJET ) VALUES ( 25001, 'Projet 1', NULL, 'INITIEE', CURRENT_DATE, CURRENT_DATE, NULL, 3, PARSEDATETIME(CONCAT(CURRENT_DATE - 2, ' 23:00'), 'yyyy-MM-dd HH:mm'), -- 拼接后解析 CURRENT_DATE, NULL, NULL );
小提醒
如果你的DATE_DEBUT字段本身只是DATE类型(不需要存时分秒),那完全没必要加时间部分;但看你特意写了23:00,应该是需要存储完整的时间戳,所以一定要用上面的方法把日期和时间正确合并,避免类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Aaron Guilbot
相关产品推荐
相关产品推荐

