使用连接的 table 字段在 where 子句中对 postgresql 日期时间数学进行续集

Sequelize postgresql datetime math in where clause using joined table field

是啊,满口的。我不明白为什么每次我使用一些蹩脚的 js 框架(即在这种情况下为 sequelize)时,我发现它在几个小时内就受到限制。够咆哮了。

版本: x86_64-pc-linux-gnu 上的 PostgreSQL 11.10 (Debian 11.10-1.pgdg90+1),由 gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516,64 位

编译

"续集": "^5.22.3"

我有两个表需要进行内部联接以获取第一个表中在第二个字段指定的时间段内未更新的所有行。在 postgresql 中,这条语句有效。我已经修改了我的代码片段以进行简化,因此对于任何语法错误深表歉意。

SELECT *
FROM order_header h,
     sla_shipping_rules r
WHERE h.shipping_method = r.shipping_method
  AND date_part('epoch', h.updated_at) + r.secondary_tax_timeout_hour < date_part('epoch', now());

我认为这在 sequelize 中不可行,但如果有人有解决方案,我很乐意被证明是错误的。在这一点上,我永远坚持续集。我尝试了大约 100 种不同的选择。下面是最新的几个。

下面的结果是 "sla_shipping_rules"."secondary_tax_timeout_hour" < NaN in where 子句被发送到 postgresql

const getPendingOrders = () => OrderHeader.findAll({
  where: {
    '$sla_shipping_rules.secondary_tax_timeout_hour$': { [Op.lt]: Math.floor(new Date()) - Math.floor(sequelize.col('OrderHeader.updated_at')) },
  },
  include: {
    attributes: ['secondary_tax_timeout_hour'],
    model: SlaShippingRules,
    as: 'sla_shipping_rules',
    on: { shipping_method: { [Op.eq]: sequelize.col('OrderHeader.shipping_method') } },
    required: true,
  },
});

下面的结果也是“sla_shipping_rules”。“secondary_tax_timeout_hour” < NaN 在发送到 postgresql

的 where 子句中
const getPendingOrders = () => OrderHeader.findAll({
  where: {
    '$sla_shipping_rules.secondary_tax_timeout_hour$': { [Op.lt]: sequelize.fn('date_part', 'epoch', sequelize.fn('now')) - sequelize.fn('date_part', 'epoch', sequelize.col('OrderHeader.updated_at')) },
  },
  include: {
    attributes: ['secondary_tax_timeout_hour'],
    model: SlaShippingRules,
    as: 'sla_shipping_rules',
    on: { shipping_method: { [Op.eq]: sequelize.col('OrderHeader.shipping_method') } },
    required: true,
  },
});

下面的结果导致 'epoch' 的列名无效我尝试了一堆不同的引号组合我也无法使 js 与 postgresql 想要的保持一致。

const getPendingOrders = () => OrderHeader.findAll({
  where: {
    '$sla_shipping_rules.secondary_tax_timeout_hour$': { [Op.lt]: sequelize.literal('date_part(`epoch`, "OrderHeader"."updated_at") - date_part(`epoch`, now())') },
  },
  include: {
    attributes: ['secondary_tax_timeout_hour'],
    model: SlaShippingRules,
    as: 'sla_shipping_rules',
    on: { shipping_method: { [Op.eq]: sequelize.col('OrderHeader.shipping_method') } },
    required: true,
  },
});

您只需要像这样用单引号替换反引号:

where: {
    '$sla_shipping_rules.secondary_tax_timeout_hour$': { [Op.lt]: sequelize.literal('date_part(\'epoch\', "OrderHeader"."updated_at") - date_part(\'epoch\', now())') },
  }