Go中MySQL转PostgreSQL的INSERT时间戳语句报错排查
解决PostgreSQL INSERT语句中INTERVAL占位符的语法错误
你遇到的语法错误是因为PostgreSQL不支持INTERVAL $3 DAY这种写法——占位符不能直接嵌入在INTERVAL关键字和时间单位之间。以下是两种可行的修正方案:
方案1:字符串拼接转INTERVAL类型
将日期计算部分改为字符串拼接后强制转换为INTERVAL类型,修正后的完整语句:
insrt := `INSERT INTO snippets (title, content, created, expires) VALUES ($1, $2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + ($3 || ' DAY')::INTERVAL)`
原理:先把占位符$3和时间单位字符串' DAY'拼接成完整的时间间隔描述,再通过::INTERVAL转换为PostgreSQL能识别的INTERVAL类型。
方案2:使用make_interval函数(推荐)
PostgreSQL内置的make_interval函数可以直接接收数值参数生成时间间隔,避免字符串拼接,语法更严谨:
insrt := `INSERT INTO snippets (title, content, created, expires) VALUES ($1, $2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + make_interval(days => $3))`
原理:make_interval(days => $3)会根据传入的$3数值直接生成对应天数的时间间隔对象,和原MySQL的DATE_ADD(UTC_TIMESTAMP(), INTERVAL ? DAY)行为完全匹配。
额外说明
若需要和原MySQL语句中的UTC_TIMESTAMP()严格一致(生成UTC时区的时间),可以把CURRENT_TIMESTAMP替换为CURRENT_TIMESTAMP AT TIME ZONE 'UTC',确保时间不带时区偏移。
内容的提问来源于stack exchange,提问作者uganerd
相关产品推荐
相关产品推荐

