如何用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
相关产品推荐
相关产品推荐

