如何使用Diesel格式化SQL结果的日期?锈

问题描述 投票:0回答:1

我是刚开始在Rust中使用Diesel,在我的调查中,我已经能够通过JOINs通过以下方式在PostgreSQL中查询数据库:

let product_id = 1;
sales::table
     .inner_join(product::table)
     .select((
         product::description,
         sales::amount,
         sales::date_sale
     ))
     .filter(sales::product_id.eq(product_id))
     .load(&diesel::PgConnection)

我的模特销售:

pub struct Sales {
    pub id: i32,
    pub product_id: Option<i32>,
    pub amount: Option<BigDecimal>,
    pub date_sale: Option<NaiveDateTime>
}

结果与预期的一样,但是我需要为字段sales::date_sale提供日期格式,而在pgadmin中我要使用to_char(date_sale, 'dd/mm/YYYY')

是否可以在Diesel中使用to_char或以什么方式修改Diesel ORM带给我的数据?

rust rust-diesel
1个回答
0
投票

[使用ORM时,将以最合适的表示形式从数据库中提取数据,以供ORM进行解释;之后,您将在目标域中对其进行操作(在这种情况下为生锈)。

由于date_saleOption<NaiveDateTime>,因此可以使用chrono提供的格式选项:

sale.date_sale.unwrap().format("%d/%m/%Y").to_string()

(当然,您的真实代码不会使用unwrap()!]

或者,如果您确实需要数据库进行格式化,则可以使用[sql][2]在查询中插入一些原始SQL:

let results = sales::table.select((sales::id, sql("to_char(date_sale, 'dd/mm/YYYY')")))
    .load::<(i32, String)>(&conn);

如果您尝试实现一些在SQL中更容易或更有效地实现的逻辑,这将更加有用。

一个例子是一个过滤条件:假设您要包括表中的行,其中星期数是偶数。虽然您可以加载整个表,然后在rust域中对其进行过滤,但这并不是很有效。相反,您可以这样做:

let results = sales::table
    .filter(sql("extract(week from date_sale)::smallint % 2=0"))
    .load::<Sales>(&conn);
© www.soinside.com 2019 - 2024. All rights reserved.