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


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

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

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

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

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

使用 whereRaw 解决日期筛选问题

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

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

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

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

function getData(req, res) {
    const targetDate = '2025-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 }));
}

在上述代码中:

Facetune Facetune

一款在线照片和视频编辑工具,允许用户创建AI头像

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

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

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

function getData(req, res) {
    const targetDate = '2025-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 = '2025-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 查询。同时,也应根据具体场景和性能要求,考虑是否采用范围查询作为替代方案。

以上就是Knex.js 中从 MySQL datetime 列按日期筛选数据的实用指南的详细内容,更多请关注其它相关文章!


# js  # seo主管的工作  # 吉林国内的网站推广有哪些  # 外贸营销推广公司朔州  # 苏州现代建设公司网站  # 小白站长的seo  # 推广的网站哪些比较有名  # 但在  # 也能  # 两种  # 第一个  # 这一  # 您的  # 数据库中  # 按日  # 是一个  # 绑定  # app  # 编码  # node  # json  # node.js  # mysql  # 市中区seo推广网站  # 跨境电商营销推广策划  # 服装模型网站推广方案  # 惠州网站建设举措 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Python中安全地将环境变量转换为整数的类型注解指南  空腹吃苹果好吗 苹果空腹摄入指南  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  B站怎么快速升级 B站用户等级提升攻略【详解】  CSS如何控制元素外边距_margin实现布局间隔  C++ static关键字作用_C++静态成员变量与静态函数  PySimpleGUI中实现键盘按键与按钮事件绑定教程  12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  Animex动漫社社登录官网 Animex动漫社资源社入口直达  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  支付宝网页版在线入口 支付宝官网电脑登录入口  如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成  HTML中多图片上传与预览:解决ID冲突的专业指南  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  《土豆雅思》修改密码方法  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  《华夏千秋》龙女试炼功法获取方法  天堂漫画网页版在线阅读 天堂漫画手机版入口  中大网校app做题记录清除方法  如何配置VS Code作为您Git操作的默认编辑器  mysql怎么查询数据_mysql基础查询语句使用教程  智学网成绩单查询系统网_智学网学生平台登录  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  《oppo商城》维修服务位置  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  苹果如何下载nanobanana  C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例  word表格如何按某一列内容进行排序_Word表格按列排序方法  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  被称为海蜈蚣的海洋动物是  mysql如何管理数据库账户_mysql数据库账户管理技巧  优化 React onClick 事件处理:函数引用与箭头函数的对比  J*a中导出MySQL表为SQL脚本的两种方法  J*aScript桌面应用_Electron多进程架构实战  魔法祈幻界兑换码礼包大全  Python中深度嵌套字典与列表的数据提取与条件过滤指南  抖音网页版官方链接 抖音网页版官网链接入口  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  J*aScript实现网页表单实时输入字段比较与验证教程  广州地铁app准妈咪徽章领取方法  歌词怎么展示在|直播|间视频号?有什么注意事项?  全球各国上班时间表外贸邮件时间  顺丰快递收费标准查询_如何查看顺丰最新收费价格  如何通过settings.json个性化您的VS Code体验  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  德邦快递收费标准详解 

 2025-10-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.