You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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'))
  ]
}

额外排查点

  1. 确认数据存在:先手动在数据库中执行原生SQL(SELECT * FROM studentAssessmentTransactions WHERE DATE(createdAt) = DATE(updatedAt);),验证是否真有符合条件的记录。
  2. 软删除数据处理:你的模型开启了paranoid: true,默认查询会排除软删除(deletedAt不为null)的数据。如果需要包含这类数据,添加paranoid: false选项:
const matchingRecords = await StudentAssessmentTransaction.findAll({
  where: literal("DATE(createdAt) = DATE(updatedAt)"),
  paranoid: false
});
  1. 表名匹配:Sequelize默认会将模型名转为复数作为表名(比如模型studentAssessmentTransaction对应表studentAssessmentTransactions),如果你之前的literal写法用了单数表名,会导致字段找不到。

内容的提问来源于stack exchange,提问作者Hiren Kalariya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:18