Snowflake Node.js驱动插入时间戳报错,如何使用CURRENT_TIMESTAMP实现
问题原因
你之前的时间格式化写法存在错误:moment().format('YYYY-DD-M H:mm:ss.SSS') 生成的是「年-日-月」格式的字符串,比如报错信息中的2021-14-9实际代表9月14日,但Snowflake默认无法识别这种日、月顺序颠倒的时间格式,因此抛出解析失败错误。
实现CURRENT_TIMESTAMP插入的方案
方案1:基于squel的原生SQL函数插入
squel默认会对.set的数值做字符串转义并添加引号,要插入SQL原生函数不需要引号,只需在.set方法中添加{ raw: true }配置,标识该值为原生SQL片段:
const statement = squel.insert() .into('SCHEMA.TABLE') .set('ID', uuid()) // 第三个参数配置raw为true,squel不会给CURRENT_TIMESTAMP()加引号 .set('RECEIVED_AT', 'CURRENT_TIMESTAMP()', { raw: true }) .toString() const queryResult = connection.execute({ sqlText: statement, complete: (err, stmt, rows) => { if (err) { console.log(err.message) } else { console.log(`${body.event} event is sent to Snowflake`) } } });
该代码生成的SQL语句和你在Snowflake工作区执行的正确语句完全一致。
方案2:使用参数绑定(更安全,推荐)
直接拼接SQL存在SQL注入风险,你可以使用Snowflake Node.js驱动自带的参数绑定能力,甚至不需要手动处理时间格式,直接传入Date对象即可:
const sqlText = `INSERT INTO SCHEMA.TABLE (ID, RECEIVED_AT) VALUES (?, ?)` const queryResult = connection.execute({ sqlText: sqlText, binds: [uuid(), new Date()], complete: (err, stmt, rows) => { if (err) { console.log(err.message) } else { console.log(`${body.event} event is sent to Snowflake`) } } });
原有代码修正方案
如果你不想使用CURRENT_TIMESTAMP,仍要自己格式化时间,只需调整moment的格式化字符串,把月、日顺序改对即可:
.set('RECEIVED_AT', moment().format('YYYY-MM-DD HH:mm:ss.SSS'))
内容的提问来源于stack exchange,提问作者Gelo Chang
相关产品推荐
相关产品推荐

