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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:01:29