[英]How to do arithmetic with timestamps and intervals in Rust Diesel
我一直在尝试使用过滤器表达式构建一个柴油查询,这些过滤器表达式对时间戳和时间间隔进行算术和比较。 我相信使用开箱即用的柴油无法编写以下表达式。 不幸的是,我采用了使用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,
}
}
我的问题:
我错了吗? 这可以用没有自定义类型的柴油编写吗?
是的,这可以用柴油提供的方法和一些小的架构更改来编写。 查看相应的文档
Diesel 要求您只能向时间戳添加/减去间隔。 这意味着您需要一点架构来实现这一点:
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
的类型videos::duration
那么沿着这条路线走下去可能很有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.