在Sequelize中使用LIKE查询DATE类型字段时的报错问题
解决DATETIME字段查询今日高分记录的错误问题
嘿,我看你在查询今日高分记录时遇到了moment警告和SQL执行错误,咱们一步步来搞定这个问题。
首先看你碰到的错误:SQL里显示LIKE 'Invalid date',还有moment的弃用警告,这根源在于你没有把生成的theDate变量正确插入到查询条件里——直接写了%theDate,相当于把字符串%theDate传给了Op.like,moment解析这个无效的字符串当然会报错,最终SQL里就变成了Invalid date。
另外,你的数据库date字段是DATETIME类型(格式是YYYY-MM-DD HH:mm:ss),如果要匹配今日所有记录,应该用${theDate}%(匹配以今日日期开头的所有时间),而不是前后加百分号的模糊匹配(那会匹配任何包含今日日期的字符串,不符合需求)。
修正后的基础版代码
先给你修复好的代码,我还优化了日期生成的逻辑,更简洁:
const { Op } = require('sequelize'); // 确保已经导入Sequelize的Op操作符 // 生成今日日期的YYYY-MM-DD格式 const today = new Date(); const theDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`; console.log('今日日期:', theDate); // 查询今日高分记录,按日期降序取前10条 stat_db.findAll({ order: [['date', 'DESC']], limit: 10, where: { date: { [Op.like]: `${theDate}%` // 正确插入变量,匹配今日所有时刻的DATETIME } } }) .then(records => { console.log('今日高分记录:', records); }) .catch(err => { console.error('查询出错:', err); });
更优雅的查询方式(推荐)
其实用LIKE匹配日期字符串不是最准确的方式,我们可以直接用日期范围查询,这样更符合DATETIME字段的特性,也避免字符串匹配的潜在问题:
const { Op } = require('sequelize'); const today = new Date(); // 今日00:00:00的时间对象 const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // 明日00:00:00的时间对象,作为范围的结束(不包含) const endOfDay = new Date(startOfDay); endOfDay.setDate(endOfDay.getDate() + 1); stat_db.findAll({ order: [['date', 'DESC']], limit: 10, where: { date: { [Op.gte]: startOfDay, // 大于等于今日0点 [Op.lt]: endOfDay // 小于明日0点 } } }) .then(records => { console.log('今日高分记录:', records); }) .catch(err => { console.error('查询出错:', err); });
这种方式直接传递日期对象,Sequelize会自动转换成数据库兼容的DATETIME格式,查询结果更准确,也不会有moment的警告问题。
内容的提问来源于stack exchange,提问作者forTheRoad
相关产品推荐
相关产品推荐

