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

Rust SQLX插入chrono::Duration至PostgreSQL INTERVAL列编码失败求助

解决SQLX插入chrono::Duration到PostgreSQL interval时的纳秒精度错误

问题原因

PostgreSQL的interval类型仅支持微秒级精度,而Rust的chrono::Duration默认保留纳秒级精度。当SQLX尝试将包含纳秒的Duration编码为PostgreSQL的interval时,就会触发PostgreSQL INTERVAL does not support nanoseconds precision错误。

解决方案

必须将chrono::Duration的精度截断到微秒级别,适配PostgreSQL的限制。以下两种简单方式均可实现:

方式1:截断现有Duration的纳秒部分

通过num_microseconds()获取微秒数,重新构造一个仅保留微秒精度的Duration:

use chrono::Duration;

let std_duration = std::time::Duration::from_secs(10);
let mut duration = Duration::from_std(std_duration).unwrap();
// 截断到微秒精度
duration = Duration::microseconds(duration.num_microseconds().unwrap());

let query_result = sqlx::query("insert into table_name (duration_column) values ($1)")
    .bind(duration)
    .execute(&executor)
    .await?;

方式2:从std::Duration直接构造微秒精度的chrono::Duration

如果是从标准库Duration转换,可直接取微秒数构造,避免中间产生纳秒:

use chrono::Duration;

let std_duration = std::time::Duration::from_secs(10);
// 直接基于微秒构造,无纳秒部分
let duration = Duration::microseconds(std_duration.as_micros() as i64);

let query_result = sqlx::query("insert into table_name (duration_column) values ($1)")
    .bind(duration)
    .execute(&executor)
    .await?;

注意事项

如果业务逻辑必须保留纳秒精度,PostgreSQL的interval类型无法满足需求,建议改用拆分存储秒数和纳秒数到两个字段的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:33:11