首页 文章

如何使用sequelize对postgres进行日期比较

提问于
浏览
0

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

我在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日期或ISO8601字符串,但两者都抛出相同的 Invalid Value 错误 . 唯一的区别是,如果我传递一个字符串,错误会在值周围显示单引号:

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

1 回答

  • 0

    嗯,这非常令人尴尬 . 我错误地构造了 where 子句 .

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

    也许我应该删除这个问题 . 也许不是 - 我得到的错误可能会更有帮助 .

相关问题