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

如何在Rust中从MySQL查询结果提取NaiveDate和NaiveTime值?

解决MySQL查询结果中NaiveDate/NaiveTime的FromValue未实现错误

问题原因

mysql crate默认未为chrono库的NaiveDate和NaiveTime类型实现FromValue trait,直接通过row.get::<NaiveDate, _>()提取会触发编译错误。

解决方案

步骤1:启用mysql crate的chrono特性

先在Cargo.toml中为mysql依赖添加chrono特性,让库自动为chrono的日期时间类型实现必要的转换trait:

[dependencies]
mysql = { version = "24.0", features = ["chrono"] }
chrono = "0.4"

步骤2:正确提取并序列化日期时间

启用特性后即可直接通过row.get提取NaiveDate和NaiveTime;如果仍有问题,可手动转换mysql的原始值:

use chrono::{NaiveDate, NaiveTime};
use mysql::{Row, Value};
use serde_json::json;

// 假设conn和stmt已初始化
let results: Vec<Row> = conn.exec(
    &stmt,
    params! {
        "date" => date
    },
)?;
let mut events = Vec::new();

for row in results {
    // 提取日期
    let date = match row.get::<Value, _>("date") {
        Ok(Value::Date(y, m, d)) => NaiveDate::from_ymd_opt(y as i32, m, d).unwrap_or_default(),
        _ => NaiveDate::default(),
    };

    // 提取时间
    let time = match row.get::<Value, _>("time") {
        Ok(Value::Time(h, min, s, micro, _)) => NaiveTime::from_hms_micro_opt(h, min, s, micro).unwrap_or_default(),
        _ => NaiveTime::default(),
    };

    let event = json!({
        "event_id": row.get::<String, _>("event_uuid").unwrap_or_default(),
        "date": date,
        "time": time,
    });
    events.push(event);
}

补充说明

  • 若使用旧版本mysql crate,特性名称可能有差异,可对应查阅版本文档。
  • unwrap_or_default()在提取失败时返回对应类型的默认值(如NaiveDate默认值为0001-01-01),可根据业务需求替换为更合适的错误处理逻辑。

内容的提问来源于stack exchange,提问作者M3KTREFE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:23:14