0

犬の散歩アプリの合計「散歩時間」を計算しています。Walks テーブルには、start_time と end_time の 2 つの列があります。特定の犬のすべての散歩の合計タイムアウトを表示したいので、2 つの列を合計し、start_time_totals から end_times_total を引くと、結果が合計タイムアウトになります。しかし、私は奇妙な結果を得ています。このように列を合計すると、

start_times = dog.walks.sum('start_time')

end_times = dog.walks.sum('end_time')

start_times と end_times の両方が同じ値を返します。サニティチェックを行うと、データベースの開始時間と終了時間が実際に期待どおりに設定されていることがわかります(午前中の開始時間、午後の終了時間)。したがって、合計はそれぞれに対して異なる値を確実に返すはずです列の。さらに、値は犬ごとに異なり、予想される相対的な値と一致しているため、散歩の多い犬は少ない犬よりも大きな値を返します。したがって、合計はおそらく機能しているように見えますが、どうにかして各列に同じ値を返すだけです。

ところで、これをdev Rails 3.2.3、ruby 2.0、SQLiteで実行しています。

4

2 に答える 2

2

日時を合計することが良い考えだとは思わないでください。必要なのは、各歩行の時間を計算して合計することです。あなたは2つの方法でそれを行うことができます:

1. DB に依存しますが、より効率的です。

# sqlite in dev and test modes    
sql = "strftime('%s',end_time) - strftime('%s',start_time)" if !Rails.env.production? 
# production with postgres
sql = "extract(epoch from end_time - start_time)" if Rails.env.production? 

total = dog.walks.sum(sql)

2. DB に依存しませんが、犬ごとに数百のレコードがある場合は効率が低下します。

total = dog.walks.all.inject(0) {|tot,w| tot+=w.end_time-w.start_time} 
于 2013-07-20T01:20:06.950 に答える
0

sqlite がこのデータ型の日時と操作をどのように処理するかはわかりませんが、sqlite コンソールで遊んでいるときに、日時を秒に変換すると信頼できる効果が得られることに気付きました。

私はそれを次のように書きます:

dog.walks.sum("strftime('%s', end_time) - strftime('%s', start_time)")

クエリは次のようになります。

select sum(strftime('%s', end_time) - strftime('%s', start_time)) from walks;
于 2013-07-20T01:20:40.597 に答える