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

如何用Sequelize按日期查询(忽略时间)匹配指定日期记录?

在Sequelize中按日期匹配查询createdAt字段的数据

当你的createdAt是datetime类型时,直接传入日期字符串(如"2022-08-23")无法匹配,因为Sequelize会将其解析为完整的datetime(如2022-08-23T00:00:00.000Z),和数据库中带时分秒的datetime值不相等。要实现DATE(createdAt) = "2022-08-23"的SQL逻辑,有两种可靠的写法:

方法1:使用Sequelize.fn和col(推荐,防SQL注入)

通过fn调用数据库的DATE()函数,结合col指定字段,Sequelize会自动处理参数绑定,避免注入风险:

// 先导入所需工具(根据你的模块类型选择)
const { Op, fn, col } = require('sequelize'); // CommonJS
// 或者 import { Op, fn, col } from 'sequelize'; // ES模块

// 查询指定日期的图书
const targetDate = '2022-08-23';
const books = await Book.findAll({
  where: {
    [fn('DATE', col('createdAt'))]: targetDate
  }
});

这段代码生成的SQL就是你需要的:

SELECT * FROM BOOKS WHERE DATE(createdAt) = '2022-08-23';

方法2:使用Sequelize.literal

如果需要直接写SQL片段,可以用literal,但注意如果日期是动态参数,要手动处理绑定(不推荐直接拼接字符串,避免注入):

const { literal } = require('sequelize');

// 静态日期写法
const books = await Book.findAll({
  where: literal(`DATE(createdAt) = '2022-08-23'`)
});

// 动态日期(安全写法,用参数占位符)
const targetDate = '2022-08-23';
const books = await Book.findAll({
  where: literal(`DATE(createdAt) = ?`, targetDate)
});

两种方法都能实现你的需求,优先选择方法1,因为它更符合Sequelize的ORM规范,且安全性更高。

内容的提问来源于stack exchange,提问作者B.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:45:59