日期时间类型的RoR sum列

时间:2013-07-20 00:14:16

标签: ruby-on-rails activerecord

我正在计算狗步行应用的总“步行时间”。 Walks表有两个cols,start_time和end_time。由于我想显示特定狗的所有步行的总时间,我应该能够将两列相加,从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中运行它。

2 个答案:

答案 0 :(得分:2)

不要认为总结日期时间是个好主意。您需要的是计算每次单步行的持续时间并求它们。你可以用两种方式做到这一点:

1。数据库依赖,但效率更高:

# 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。数据库不可知,但每只狗数百条记录的效率较低:

total = dog.walks.all.inject(0) {|tot,w| tot+=w.end_time-w.start_time} 

答案 1 :(得分:0)

我不知道,sqlite如何处理此数据类型的日期时间和操作,但在sqlite控制台中播放时,我注意到在将datetime转换为秒时我可以获得可靠的效果。

我会这样写:

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

查询应如下所示:

select sum(strftime('%s', end_time) - strftime('%s', start_time)) from walks;