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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:42:53