NodeJS 在sequelize查询中比较时间戳和日期

lrpiutwd  于 2023-04-20  发布在  Node.js
关注(0)|答案(3)|浏览(170)

我有一个createdAt列,它存储的值是"2018-11-07 15:03:16.532+00"。我想写一个类似select * from table_name where createdAt = input_date的查询,其中我的input_date只是一个类似2018-11-07的日期值。我如何使用**Sequelize**来写这个查询?

efzxgjgh

efzxgjgh1#

尝试使用sequelize.fn()参数,您可以遵循下面的示例代码。

TableName.findAll({
  where: sequelize.where(sequelize.fn('date', sequelize.col('createdAt')), '=', '2018-11-07')
})
nkoocmlb

nkoocmlb2#

接受的答案应该工作正常,但如果我们有多个条件,在那里我使用这个-

const cashRegisterData = await cashRegisterMain.findAll({
            attributes: ['crmid', 'dateCreated', 'startDate', 'endDate', 'startAmount', 'finalAmount', 'status'],
            where: {
                createdBy: userId,
                [Op.and]: [
                    sequelize.where(sequelize.fn('date', sequelize.col('dateCreated')), '>=', fromDate),
                    sequelize.where(sequelize.fn('date', sequelize.col('dateCreated')), '<=', toDate),
                ]
            },
            order: [['dateCreated', 'DESC']],
        });

生成的查询:

SELECT `crmid`, `dateCreated`, `startDate`, `endDate`, `startAmount`, `finalAmount`, `status` FROM `cashRegisterMain` AS `cashRegisterMain` WHERE (date(`dateCreated`) >= '2020-11-20' AND date(`dateCreated`) <= '2020-11-20') AND `cashRegisterMain`.`createdBy` = 1 ORDER BY `cashRegisterMain`.`dateCreated` DESC;
g0czyy6m

g0czyy6m3#

上面的两个答案都很好。它们都使用sequelize.fn(),这不是强制性的。我对使用sequelize.fn()没有任何问题,但我认为我的解决方案更具可读性-选择适合你的任何解决方案。
下面是我如何完成这个问题(使用MomentJS和TypeScript):
首先确定您的边界(开始日期、结束日期):

const beginningOfDay = moment(dateToFetch, 'YYYY-MM-DD').startOf('day');
const endOfDay = moment(dateToFetch, 'YYYY-MM-DD').endOf('day');

接下来,构建你的查询(我碰巧使用了一个三元):

const args : any = mostRecent ? {  where: { user_uid }, order: [['log_timestamp', 'DESC']] } : { where: { user_uid, log_timestamp: {
            [Op.gte]: beginningOfDay,
            [Op.lte]: endOfDay,
        }},
    };

最后-执行查询:

const userMessages: IUserMessages = await models.message.findAll(args);

相关问题