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
相关产品推荐
相关产品推荐

