将时间戳与续集查询中的日期进行比较
Compare Timestamp with date in sequelize query
我有 createdAt
列将值存储为 "2018-11-07 15:03:16.532+00"
。
我想写像 select * from table_name where createdAt = input_date
这样的查询,其中我的 input_date
只是像 2018-11-07
这样的日期值。
我如何使用 Sequelize
编写此查询?
尝试使用sequelize.fn()
参数,例如像这样,尝试调整它。
例如:
TableName.findAll({
where: sequelize.where(sequelize.fn('date', sequelize.col('createdAt')), '=', '2018-11-07')
})
接受的答案应该可以正常工作,但是如果我在使用这个的地方有多个条件 -
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;
以上两个答案都可以。他们都使用 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);
我有 createdAt
列将值存储为 "2018-11-07 15:03:16.532+00"
。
我想写像 select * from table_name where createdAt = input_date
这样的查询,其中我的 input_date
只是像 2018-11-07
这样的日期值。
我如何使用 Sequelize
编写此查询?
尝试使用sequelize.fn()
参数,例如像这样,尝试调整它。
例如:
TableName.findAll({
where: sequelize.where(sequelize.fn('date', sequelize.col('createdAt')), '=', '2018-11-07')
})
接受的答案应该可以正常工作,但是如果我在使用这个的地方有多个条件 -
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;
以上两个答案都可以。他们都使用 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);