如何在Sequelize中查询createdAt与updatedAt日期(不含时间)相同的数据
在Sequelize中查询createdAt与updatedAt日期部分相同的数据
以下是几种可行的解决方案,同时分析你之前写法可能存在的问题:
方法1:简化literal写法(推荐)
你之前的literal写法指定了全表名,但Sequelize在查询时会自动处理表的别名,直接使用字段名即可,避免表名不匹配的问题:
const { literal } = require('sequelize'); const matchingRecords = await StudentAssessmentTransaction.findAll({ where: literal("DATE(createdAt) = DATE(updatedAt)") });
方法2:使用fn和col的正确语法
如果偏好使用Sequelize的内置方法而非原生SQL字符串,确保条件结构正确:
const { Op, fn, col } = require('sequelize'); const matchingRecords = await StudentAssessmentTransaction.findAll({ where: { [Op.eq]: [fn('DATE', col('createdAt')), fn('DATE', col('updatedAt'))] } });
针对特定数据库的优化写法
不同数据库的日期处理函数略有差异,可针对性调整:
- MySQL:使用
DATE_FORMAT精确格式化日期
where: { [Op.eq]: [ fn('DATE_FORMAT', col('createdAt'), '%Y-%m-%d'), fn('DATE_FORMAT', col('updatedAt'), '%Y-%m-%d') ] }
- PostgreSQL:使用
DATE_TRUNC截断到日期部分
where: { [Op.eq]: [ fn('DATE_TRUNC', 'day', col('createdAt')), fn('DATE_TRUNC', 'day', col('updatedAt')) ] }
额外排查点
- 确认数据存在:先手动在数据库中执行原生SQL(
SELECT * FROM studentAssessmentTransactions WHERE DATE(createdAt) = DATE(updatedAt);),验证是否真有符合条件的记录。 - 软删除数据处理:你的模型开启了
paranoid: true,默认查询会排除软删除(deletedAt不为null)的数据。如果需要包含这类数据,添加paranoid: false选项:
const matchingRecords = await StudentAssessmentTransaction.findAll({ where: literal("DATE(createdAt) = DATE(updatedAt)"), paranoid: false });
- 表名匹配:Sequelize默认会将模型名转为复数作为表名(比如模型
studentAssessmentTransaction对应表studentAssessmentTransactions),如果你之前的literal写法用了单数表名,会导致字段找不到。
内容的提问来源于stack exchange,提问作者Hiren Kalariya
相关产品推荐
相关产品推荐

