如何使用Diesel通过Unix时间戳查询Timestamptz类型字段?
将Unix毫秒时间戳转换为Diesel的Timestamptz格式
首先纠正一个常见误区:diesel::sql_types::Timestamptz是数据库schema的标记类型,并非用于运行时存储时间值的类型。你需要借助chrono库的时间类型,结合Diesel的chrono特性来完成转换。
步骤1:更新依赖
修改Cargo.toml,添加chrono依赖,并开启Diesel的chrono特性,让Diesel支持chrono类型与Timestamptz的自动转换:
[dependencies] diesel = { version = "1.4.7", features = ["postgres", "chrono"] } chrono = "0.4"
步骤2:转换毫秒时间戳为可用类型
使用chrono的DateTime::from_timestamp_millis方法将毫秒时间戳转换为DateTime<Utc>,该类型可直接用于Diesel查询(Diesel会自动将其映射到Postgres的TIMESTAMPTZ类型):
use chrono::{DateTime, Utc}; use diesel::prelude::*; // 假设你的schema定义示例 // table! { // posts (id) { // id -> Int4, // created_at -> Timestamptz, // } // } fn main() { let unix_time_ms: i64 = 1234567890123; // 示例毫秒时间戳 // 将毫秒时间戳转换为UTC时间,处理可能的无效时间戳 let dt = DateTime::from_timestamp_millis(unix_time_ms) .expect("无效的Unix毫秒时间戳"); // 直接在Diesel查询中使用该时间值 // 示例:查询created_at早于该时间的记录 // let conn = PgConnection::establish("postgres://user:pass@localhost/db").unwrap(); // let results = posts::table // .filter(posts::created_at.lt(dt)) // .load::<Post>(&conn) // .unwrap(); }
额外说明
- 如果需要显式构建对应
Timestamptz的表达式类型,可使用as_expression()方法:use diesel::sql_types::Timestamptz; use diesel::expression::AsExpression; let timestamptz_expr = dt.as_expression::<Timestamptz>(); from_timestamp_millis返回Option<DateTime<Utc>>,必须处理无效时间戳的情况(比如数值超出时间范围)。- 始终使用带时区的时间类型(如
DateTime<Utc>),避免时区不匹配导致的查询逻辑错误。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

