PostgreSQL执行INSERT时NOW()+INTERVAL 2 DAYS报语法错误
报错原因
从命令行提示符可判断你当前使用的是PostgreSQL数据库,你写的INTERVAL 2 DAYS是MySQL体系的时间间隔语法,不符合PostgreSQL的语法规则:PostgreSQL解析到INTERVAL关键字后,默认要求后续跟被单引号包裹的间隔描述字符串,直接传入裸数字2时,解析器无法识别语法结构,就会抛出位置在"2"附近的语法错误。
你查到的写法本身没有问题,但大概率是对应MySQL数据库的示例,和你当前使用的数据库语法不匹配。
可行的正确写法
以下三种写法都可以在PostgreSQL中实现“当前时间加2天”的逻辑,按需选择即可:
- 标准间隔字面量写法(通用性最高,日常使用推荐)
直接将间隔值和单位包裹在单引号内,单位不区分单复数、大小写:
INSERT INTO habit_instances (habit_id,completed,create_date,due_date) VALUES (1,FALSE,NOW(),NOW()+INTERVAL '2 DAYS');
- 数值乘法写法
用固定单位的间隔做乘法计算,更适合后续需要动态传入间隔天数的场景:
INSERT INTO habit_instances (habit_id,completed,create_date,due_date) VALUES (1,FALSE,NOW(),NOW()+ 2 * INTERVAL '1 day');
- 内置函数构造写法
使用PostgreSQL原生的make_interval函数构造时间间隔,参数语义清晰,适合需要拼接年、月、日、小时等多单位复杂间隔的场景:
INSERT INTO habit_instances (habit_id,completed,create_date,due_date) VALUES (1,FALSE,NOW(),NOW()+ make_interval(days => 2));
补充说明:不要混淆不同数据库的方言语法,MySQL支持
INTERVAL 2 DAY这种不带引号的简写写法,但该写法在PostgreSQL、Oracle等数据库中无法正常执行。
内容的提问来源于stack exchange,提问作者HotSauceCoconuts
相关产品推荐
相关产品推荐

