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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:54:03