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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Diesel格式化SQL结果的日期?锈相关的知识,希望对你有一定的参考价值。

我是刚开始在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带给我的数据?

答案

[使用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);

以上是关于如何使用Diesel格式化SQL结果的日期?锈的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql中根据日期获取数据

是否可以在柴油中使用没有主键的表?锈

如何使用 SQL 函数和用户提供的输入创建自定义 Diesel 查询?

SQL Server——如何指定日期格式

Diesel join 无法推断类型

如何重新运行 Diesel 迁移?