1

Rails 3 アプリ、pg アダプター、私のスキーマは次のようになります。

create_table "events", :force => true do |t|
 t.integer  "event_type_id"
 t.datetime "start_at"
 #...
end

データの例には次のようなものがあります。

p.events.each{|e| puts e.start_at }; 1
2009-03-23 08:30:00 UTC
2009-05-20 07:45:00 UTC
2009-05-20 07:45:00 UTC
2009-03-23 16:00:00 UTC
2009-05-20 10:00:00 UTC
2009-03-23 19:30:00 UTC
2009-03-23 11:30:00 UTC
2009-05-20 07:45:00 UTC
2009-05-20 07:45:00 UTC
2009-05-20 09:00:00 UTC
2009-05-20 07:45:00 UTC

次の 3 時間の間に検索したいのですが、その日は無視してください。私にとって重要なのは時間と分
だけです .Postgresで行うことは可能ですか? pg EXTRACT()を使用しようとしましたが、これまでのところ成功していません

Rubyコードですべての日付をフィルタリングしたくありません:(

4

2 に答える 2

1

分を無視し、時間のみを考慮します。

#On my model    
scope :next_3_hours, ->(h){
  where( [" date_part( 'hour', \"start_at\") = ? OR date_part( 'hour', \"start_at\") = ? OR date_part( 'hour', \"start_at\") = ? ",h,h+1,h+2])
    .order("date_part( 'hour', \"start_at\") ASC, date_part( 'minute', \"start_at\")")
}

結果:

# on SQL (considering now to be 17:00)
SELECT "events".* FROM "events"
WHERE ( date_part( 'hour', "start_at") = 17 
        OR date_part( 'hour', "start_at") = 18
        OR date_part( 'hour', "start_at") = 19 )
ORDER BY date_part( 'hour', "start_at") ASC, date_part( 'minute', "start_at")
于 2012-08-04T01:38:57.640 に答える
1

PostgreSQL でこれを行う方法を 1 つだけ紹介します。私は RoR の経験がないので、その部分についてはお手伝いできません。

以下の基本的な考え方は、時間と分を比較できるように、すべてのタイムスタンプを同じ日に変換するというものです。

  1. タイムスタンプを時分のみを含む文字列に変換します
  2. その文字列をタイムスタンプに戻すと、日付部分が 1 年目の 1 月 1 日になります。

create table test (id serial, start_at timestamp);

insert into test(start_at)
select * from generate_series('2008-03-01 00:00'::timestamp,
                              '2008-03-15 12:00', '5 hours');

with 
hh24mi_now as (select to_timestamp(to_char(current_timestamp, 'HH24:MI'), 'HH24:MI'))
select * from test where id in (
  select id
    from test
   where to_timestamp(to_char(start_at, 'HH24:MI'), 'HH24:MI') >= (select * from hh24mi_now)
     and to_timestamp(to_char(start_at, 'HH24:MI'), 'HH24:MI') < (select * from hh24mi_now) + interval '3 hours'
  )
order by id
;

実行例の結果:

 id |      start_at       
----+---------------------
 13 | 2008-03-03 12:00:00
 18 | 2008-03-04 13:00:00
 23 | 2008-03-05 14:00:00
 37 | 2008-03-08 12:00:00
 42 | 2008-03-09 13:00:00
 47 | 2008-03-10 14:00:00
 61 | 2008-03-13 12:00:00
 66 | 2008-03-14 13:00:00
于 2012-07-29T09:01:59.183 に答える