如何使用Knex从MySQL的datetime列按日期筛选数据?
Knex筛选Datetime列指定日期数据的正确写法
错误原因分析
- 直接写
date(created_at)报错是因为你调用了未定义的date函数(JavaScript中日期构造函数是大写的Date,且这里需要调用MySQL的DATE()函数而非JS方法)。 - 直接用
.where('created_at', '=', '2022-08-15')不生效,是因为created_at是datetime类型,值包含时分秒(如2022-08-15 14:30:00),与纯日期字符串无法完全匹配。
正确写法
方法1:使用whereRaw直接编写SQL片段
这是最贴近原生SQL的写法,适合熟悉MySQL语法的场景:
function getData(req, res) { app.db('table') .select('*') .whereRaw('date(`created_at`) = ?', ['2022-08-15']) .then(data => res.json(data)) .catch(err => res.status(500).json({ error: err.message })); }
方法2:使用Knex的fn.date调用SQL函数
利用Knex提供的fn对象调用MySQL内置函数,保持Knex链式调用风格:
function getData(req, res) { app.db('table') .select('*') .where(app.db.fn.date('created_at'), '=', '2022-08-15') .then(data => res.json(data)) .catch(err => res.status(500).json({ error: err.message })); }
补充说明
- 如果你的
table是预定义的表对象(如通过knex.schema.table创建的),可以把select('*')换成select(table.*)。 - 务必添加错误捕获逻辑,避免请求因数据库异常而挂起。
内容的提问来源于stack exchange,提问作者carolcal
相关产品推荐
相关产品推荐

