Mysql 如何使用在rust、diesel中强制转换的sql函数?

Mysql 如何使用在rust、diesel中强制转换的sql函数?,mysql,rust,rust-diesel,Mysql,Rust,Rust Diesel,我正在使用Rocket开发一个新的端点,并试图返回一个由各种结构组成的Vec 我想在diesel中复制的原始查询是: select location.id, location.name, w.datetime, t.temp, w.compass, w.speed, r.probability, s.height from location inner join rainfall r on location.id = r.location inner join temperature t on

我正在使用Rocket开发一个新的端点,并试图返回一个由各种结构组成的Vec

我想在diesel中复制的原始查询是:

select location.id, location.name, w.datetime, t.temp, w.compass, w.speed, r.probability, s.height
from location
inner join rainfall r on location.id = r.location
inner join temperature t on location.id = t.location
inner join wind w on location.id = w.location
inner join swell s on location.id = s.location
where t.datetime = w.datetime
  and s.datetime = t.datetime
  and CAST(t.datetime as date) = CAST(r.datetime as date)
  and t.datetime > now() and t.datetime < NOW() + INTERVAL 1 HOUR;
我认识到,为了使用CAST函数,我需要使用宏:

这允许我创建以下查询:

let summaries: Vec<(Location, Swell, Wind, Temperature, Rainfall)> = location::table
        .inner_join(swell::table)
        .inner_join(wind::table)
        .inner_join(temperature::table)
        .inner_join(rainfall::table)
        .filter(temperature::datetime.eq(wind::datetime))
        .filter(temperature::datetime.eq(swell::datetime))
        .filter(temperature::datetime.gt(utilities::today()))
        .filter(temperature::datetime.lt(utilities::future_hour(1)))
        .filter(cast(temperature::datetime).eq(cast(rainfall::datetime)))
        .load(&conn.0)?;
但是,当我运行此查询时,会出现SQL查询错误:

您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行使用near\'=CAST'rainment.'datetime'\'的正确语法

如原始SQL语句所示,它应该将CAST'rainment.'datetime'读取为date

我的问题是,如何将“as date”组件添加到diesel查询中?sql_函数定义中是否缺少某些内容


谢谢你的帮助。

我在深入研究类似问题后找到了答案

事实证明,在添加以下内容后,可以在.filter方法中输入原始sql字符串:use diesel::expression::sql\u literal::sql

因此,最后一个片段变成:

let summaries: Vec<(Location, Swell, Wind, Temperature, Rainfall)> = location::table
        .inner_join(swell::table)
        .inner_join(wind::table)
        .inner_join(temperature::table)
        .inner_join(rainfall::table)
        .filter(temperature::datetime.eq(wind::datetime))
        .filter(temperature::datetime.eq(swell::datetime))
        .filter(temperature::datetime.gt(utilities::today()))
        .filter(temperature::datetime.lt(utilities::future_hour(1)))
        .filter(sql("CAST(`temperature`.`datetime` as date) = CAST(`rainfall`.`datetime` as date)"))
        .load(&conn.0)?;

我希望这对其他人有帮助

是否可以将原始sql输入到。选择以使用to_char方法?例如:从Diesel ORM中的表格名称中选择“日期”字段“YYYY-MM”
let summaries: Vec<(Location, Swell, Wind, Temperature, Rainfall)> = location::table
        .inner_join(swell::table)
        .inner_join(wind::table)
        .inner_join(temperature::table)
        .inner_join(rainfall::table)
        .filter(temperature::datetime.eq(wind::datetime))
        .filter(temperature::datetime.eq(swell::datetime))
        .filter(temperature::datetime.gt(utilities::today()))
        .filter(temperature::datetime.lt(utilities::future_hour(1)))
        .filter(sql("CAST(`temperature`.`datetime` as date) = CAST(`rainfall`.`datetime` as date)"))
        .load(&conn.0)?;