【问题标题】:How to perform date comparisons against postgres with sequelize如何使用 sequelize 对 postgres 执行日期比较
【发布时间】:2019-04-24 13:00:24
【问题描述】:

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

【问题讨论】:

    标签: javascript postgresql date sequelize.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 您也可以接受您的回答。我认为它很有用。 ;-)
    • 不得不等待 2 天。仍然可能会删除它......我们会看到它收集了多少仇恨。
    猜你喜欢
    • 2021-08-17
    • 2020-08-14
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2010-11-08
    • 2023-03-15
    相关资源
    最近更新 更多