Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用PostgreSQL避免重复;Rails中时间戳的时间间隔?_Ruby On Rails_Postgresql_Between - Fatal编程技术网

Ruby on rails 如何使用PostgreSQL避免重复;Rails中时间戳的时间间隔?

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

我在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_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