我一直在尝试使用过滤器表达式构造一个柴油查询,该表达式可以对时间戳和时间间隔进行算术和比较。我相信以下的表达是不可能用开箱即用的柴油写的.不幸的是,我求助于使用sql(...)函数的大锤方法:
let query = videos::table
.inner_join(events::table)
.filter(sql(r#""events"."start_date" <= NOW() + interval '60 seconds'"#))
.filter(sql(r#""events"."start_date" + ("videos"."duration" * interval '1 second') > NOW()"#))我的(缩写)模式:
table! {
events (id) {
id -> Int4,
video_id -> Int4,
start_date -> Timestamp,
}
}
table! {
videos (id) {
id -> Int4,
duration -> Float4,
}
}我的问题:
发布于 2020-01-30 21:11:14
我说错了吗?这能用没有定制类型的柴油写吗?
是的,这可以用柴油提供的方法和一些小的模式修改来编写。参见相应的文档
柴油要求您只能在时间戳中添加/减缩间隔。这意味着您需要稍微使用模式才能做到这一点:
table! {
videos (id) {
id -> Int4,
duration -> Interval,
}
}然后,您的查询如下所示:
let query = videos::table
.inner_join(events::table)
.filter(events::start_date.le(now + 60.seconds()))
.filter(now.lt(events::start_date + videos::duration))如果这不能用香草柴油写,我如何才能把它分解成一个更安全,柴油友好的表达方式呢?哪些部件是定制的,哪些是我需要实施的特性?
从理论上讲,在柴油以外实施这一措施是可能的。该代码很可能与在柴油中实现该代码的方法相同。您可能需要使用本地类型和更多具体的隐式。因此,如果您不能更改videos::duration的类型,那么沿着这条路线走下去可能是有意义的。
https://stackoverflow.com/questions/59989388
复制相似问题