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

2024-03-16

我想删除日期在 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' }

嗯,这真是太尴尬了。我构建了where条款不正确。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用sequelize 与postgres 进行日期比较 的相关文章