Ruby on rails 如何使用PostgreSQL避免重复;Rails中时间戳的时间间隔?
我在Rails应用程序中有一个查询,如下所示。基本上,我想获取昨天上午9:30到今天上午9:30之间创建的记录。我打算在每天运行一次的任务中使用此查询Ruby on rails 如何使用PostgreSQL避免重复;Rails中时间戳的时间间隔?,ruby-on-rails,postgresql,between,Ruby On Rails,Postgresql,Between,我在Rails应用程序中有一个查询,如下所示。基本上,我想获取昨天上午9:30到今天上午9:30之间创建的记录。我打算在每天运行一次的任务中使用此查询 last_execution_time=time.zone.parse(“{time.zone.dayed.strftime(“%Y-%m-%d”)}09:30:00}”) 此执行时间=time.zone.parse(“{time.zone.today.strftime(“%Y-%m-%d”)}09:30:00}”) new_cat_record
last_execution_time=time.zone.parse(“{time.zone.dayed.strftime(“%Y-%m-%d”)}09:30:00}”)
此执行时间=time.zone.parse(“{time.zone.today.strftime(“%Y-%m-%d”)}09:30:00}”)
new_cat_records=cat.where(创建时间:上次执行时间..本次执行时间)
然而,我担心在上午9:30创建的记录会发生什么情况。如果我今天和明天运行这个查询,它会同时被包括在内吗?
我知道PostgreSQL的BETWEEN
包括范围边界():
中间谓词简化了范围测试:
a BETWEEN x AND y
相当于
a >= x AND a <= y
a>=x和a您可以这样查询:
Cat.where("created_at >= ? AND created_at < ?", last_execution_time, this_execution_time)
Cat.where(“创建时间>=”和创建时间<?”,上次执行时间,本次执行时间)
或
Cat.where(“created_at>”和created_at您可以查询如下内容:
Cat.where("created_at >= ? AND created_at < ?", last_execution_time, this_execution_time)
Cat.where(“创建时间>=”和创建时间<?”,上次执行时间,本次执行时间)
或
Cat.where(“created_at>”和created_at是的,如果在和09:30:00..09:30:00之间使用,边界条件会有小问题
您可以以毫秒为单位更改此执行时间:
this_execution_time = Time.zone.parse("#{Time.zone.today.strftime('%Y-%m-%d')} 09:29:59.999999}")
也可以使用Arel或clean sql编写正确的条件:
Cat.where(Cat.arel_table[:created_at].gteq(last_execution_time).and(Cat.arel_table[:created_at].lt(this_execution_time)))
Cat.where("created_at >= ? AND created_at < ?", last_execution_time, this_execution_time)
Cat.where(Cat.arel_表[:created_at].gteq(上次执行时间)和(Cat.arel_表[:created_at].lt(本次执行时间)))
目录式(“创建时间>=?和创建时间<?”,上次执行时间,本次执行时间)
但是,如果编写一些边界条件测试并在那里进行检查,效果会更好。是的,如果在和09:30:00..09:30:00之间使用,边界条件会有小问题
您可以以毫秒为单位更改此执行时间:
this_execution_time = Time.zone.parse("#{Time.zone.today.strftime('%Y-%m-%d')} 09:29:59.999999}")
也可以使用Arel或clean sql编写正确的条件:
Cat.where(Cat.arel_table[:created_at].gteq(last_execution_time).and(Cat.arel_table[:created_at].lt(this_execution_time)))
Cat.where("created_at >= ? AND created_at < ?", last_execution_time, this_execution_time)
Cat.where(Cat.arel_表[:created_at].gteq(上次执行时间)和(Cat.arel_表[:created_at].lt(本次执行时间)))
目录式(“创建时间>=?和创建时间<?”,上次执行时间,本次执行时间)
但是如果你写一些边界条件测试并在那里检查会更好。我不太了解Rails,读了一些书,但仅此而已,但我确实知道一些Postgres-也许会有所帮助。Postgres的概念允许设置类似于中间的结构,但也允许定义是否包含端点。在本文中案例包括开始时间,不包括结束时间。下面创建了这样一个间隔:
with date_period as
( select current_date + interval '9:30:00' d1
, current_date + interval '1 day' + interval '9:30:00' d2
)
, op_dates as
( SELECT generate_series(current_date, current_date+interval '2 day', interval '.5 hours') run_dt)
select run_dt
from op_dates
, date_period
where 1=1
and run_dt <@ tsrange(d1, d2, '[)');
我对Rails了解不多,读过一些书,但仅此而已,但我知道一点Postgres-也许这会有所帮助。Postgres的概念允许设置类似于BETWEEN的结构,但也允许定义是否包含端点。在这种情况下,包括开始时间和排除结束时间。下面创建了这样一个int埃瓦尔:
with date_period as
( select current_date + interval '9:30:00' d1
, current_date + interval '1 day' + interval '9:30:00' d2
)
, op_dates as
( SELECT generate_series(current_date, current_date+interval '2 day', interval '.5 hours') run_dt)
select run_dt
from op_dates
, date_period
where 1=1
and run_dt <@ tsrange(d1, d2, '[)');
您可以编写上次执行时间>9:30(昨天)和这次执行时间的查询您可以编写上次执行时间>9:30(昨天)和这次执行时间的查询您的解决方案导致:PG::SyntaxError:ERROR:语法错误在或接近“事实上,我自己刚想出来-是和
。像这样:Cat.where(“cats.created_at>=?和cats.created_at<?”,上次执行,这次执行)
哦,是的,我的错,我会解决的。你的解决方案导致了这个:PG::SyntaxError:ERROR:syntaxer错误在或附近“事实上,我自己就知道了-它是和
。就像这样:Cat.where(“cats.created_at>=?和cats.created_at<?”,上次执行,这次执行)
哦,是的,我不好,我会在其他回复中修复它,也许会尝试。如果我的语法正确的话”Cat.where(“在查看其他回复时创建,也许可以尝试。如果语法正确,“Cat.where”(“created_at