如何使用Sequelize对Postgres执行日期比较

时间:2018-11-21 21:42:39

标签: javascript postgresql date sequelize.js

我想删除所有日期早于20分钟的记录。我提供的裸javascript Date对象作为比较值,Postgres(或Sequelize)不满意。

我正在使用postgres 9.6数据库之上的sequelize 4.37。

有问题的列用type: Sequelize.DATE声明,研究表明该列等同于TIMESTAMP WITH TIME ZONE:完整的日期和时间(微秒精度)和时区指示符。 (这也是我使用psql CLI工具描述表时看到的。)

所以,我这样做:

const Sequelize = require('sequelize')
const { SomeModel } = require('../models.js')

// calculate 20 minutes ago
async function deleteStuff() {
  const deletionCutoff = new Date()
  deletionCutoff.setMinutes( deletionCutoff.getMinutes() - 20 ) 

  await SomeModel.destroy({
    where: {
      [ Sequelize.Op.lt ]: { dateColumn: deletionCutoff }
    }
  })

但是我得到这个错误:

Error: Invalid value { dateColumn: 2018-11-21T21:26:16.849Z }

文档建议我应该能够提供裸露的JavaScript Date或ISO8601字符串,但两者均会引发相同的Invalid Value错误。唯一的区别是,如果我传递字符串,则错误将在值周围显示单引号:

// error when dateColumn: deletionCutoff.toISOString()
Error: Invalid value { dateColumn: '2018-11-21T21:26:16.849Z' }

1 个答案:

答案 0 :(得分:0)

好吧,这很尴尬。我错误地构造了where子句。

// BAD CODE
await SomeModel.destroy({
  where: {
    [ Sequelize.Op.lt ]: {
      dateColumn: deletionCutoff
    }
  }
})


// GOOD CODE
await SomeModel.destroy({
  where: {
    dateColumn: {
      [ Sequelize.Op.lt ]: deletionCutoff
    }
  }
})

也许我应该删除问题。也许不是,我得到的错误可能会更有帮助。