0

0

Knex.js 中从 MySQL datetime 列按日期筛选数据的实用指南

霞舞

霞舞

发布时间:2025-10-13 11:49:33

|

653人浏览过

|

来源于php中文网

原创

Knex.js 中从 MySQL datetime 列按日期筛选数据的实用指南

本教程旨在解决 knex.jsmysql 中按日期筛选 `datetime` 类型列数据时遇到的挑战。针对 knex 直接调用 `date()` 函数的限制,文章详细阐述了如何利用 `whereraw` 方法实现这一功能,并提供了两种实现方式:安全的参数绑定和便捷的直接值插入。同时,强调了在使用 `whereraw` 时应关注的安全性考量,以确保构建高效且健壮的数据库查询。

在开发基于 Node.js 和 MySQL 的应用时,我们经常需要从数据库中检索数据。当数据库中的时间信息存储在 datetime 类型的列中,而我们仅希望根据日期部分进行筛选时,会遇到一些挑战。例如,在 MySQL 中,可以直接使用 DATE() 函数来提取 datetime 列的日期部分进行比较:

SELECT * FROM table WHERE DATE(created_at) = '2022-08-15';

然而,在使用 Knex.js 这样的 SQL 查询构建器时,直接将 DATE() 函数作为 where 条件的一部分可能会导致 ReferenceError: date is not defined 错误,因为 Knex 的 where 方法默认期望列名或 Knex 内部函数,而非直接的 SQL 函数调用。如果简单地使用 where(created_at, '=', '2022-08-15'),由于 created_at 是 datetime 类型,而我们提供的参数是日期字符串,将无法精确匹配,因为 datetime 类型通常包含时间信息(例如 '2022-08-15 00:00:00')。

使用 whereRaw 解决日期筛选问题

Knex.js 提供了 whereRaw 方法,允许开发者直接插入原生的 SQL 片段作为查询条件。这正是解决上述问题的关键。whereRaw 方法接受一个 SQL 字符串作为第一个参数,以及一个可选的参数数组作为第二个参数,用于绑定到 SQL 字符串中的占位符。

方法一:使用参数绑定(推荐)

参数绑定是构建 SQL 查询时最安全和推荐的做法,它可以有效防止 SQL 注入攻击。通过将动态值作为单独的参数传递,数据库驱动会负责正确地转义这些值。

以下是如何使用 whereRaw 和参数绑定来按日期筛选 datetime 列的示例:

function getData(req, res) {
    const targetDate = '2022-08-15'; // 假设日期从请求中获取或已定义
    app.db('table')
        .select('*') // 选择所有列,或指定所需列如 'table.id', 'table.name'
        .whereRaw('DATE(created_at) = ?', [targetDate])
        .then(data => res.json(data))
        .catch(error => res.status(500).json({ message: '查询失败', error }));
}

在上述代码中:

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载
  • 'DATE(created_at) = ?' 是原生 SQL 片段,? 是一个占位符。
  • [targetDate] 是一个数组,其中包含要绑定到占位符的值。Knex 会自动处理 targetDate 的转义。

方法二:直接插入值(谨慎使用)

如果开发者对输入值的来源完全信任,并且确定值不需要任何转义(例如,硬编码的日期字符串或经过严格验证的输入),也可以将值直接插入到 SQL 字符串中。然而,这种方法存在潜在的 SQL 注入风险,因此不建议用于处理用户提供的任何输入

function getData(req, res) {
    const targetDate = '2022-08-15'; // 假设日期是一个已知且安全的值
    app.db('table')
        .select('*')
        .whereRaw(`DATE(created_at) = "${targetDate}"`) // 使用模板字符串插入值
        .then(data => res.json(data))
        .catch(error => res.status(500).json({ message: '查询失败', error }));
}

请注意,这里使用了模板字符串(反引号 `)来方便地将 targetDate 变量嵌入到 SQL 字符串中,并用双引号 " 将日期值包裹起来,以符合 SQL 字符串字面量的要求。

注意事项

  1. 安全性:始终优先使用参数绑定(方法一)。直接插入值(方法二)应仅限于完全信任的数据源,并且开发者必须确保这些数据不会包含恶意 SQL 代码。否则,这可能导致严重的 SQL 注入漏洞。
  2. 数据库兼容性:DATE() 函数在 MySQL 中是标准用法,但在其他数据库系统(如 PostgreSQL、SQL Server)中,提取日期部分的函数名称可能不同(例如 PostgreSQL 的 DATE() 也能工作,或 created_at::date 类型转换)。在使用 whereRaw 时,请确保您的原生 SQL 片段与目标数据库兼容。
  3. 性能:在 created_at 列上使用 DATE() 函数可能会阻止数据库利用该列上的索引。如果性能是关键考量,并且 created_at 列上有索引,可以考虑其他查询策略,例如范围查询:
    // 假设 targetDate = '2022-08-15'
    const startDate = `${targetDate} 00:00:00`;
    const endDate = `${targetDate} 23:59:59`;
    app.db('table')
        .select('*')
        .where('created_at', '>=', startDate)
        .andWhere('created_at', '<=', endDate)
        .then(data => res.json(data));

    这种范围查询通常能够更好地利用 created_at 列上的索引。

总结

通过 Knex.js 的 whereRaw 方法,我们可以灵活地将原生 SQL 函数和逻辑融入到查询构建器中,从而解决了在 MySQL 中按日期筛选 datetime 列的特定需求。在实践中,为了确保应用程序的安全性和健壮性,强烈建议采用参数绑定的方式来构建 whereRaw 查询。同时,也应根据具体场景和性能要求,考虑是否采用范围查询作为替代方案。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

358

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

677

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 804人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号