0

我正在计算遛狗应用程序的总“步行时间”。Walks 表有两个列,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 都返回相同的值。进行完整性检查,我发现我在数据库中的开始和结束时间确实按照我的预期设置(早上开始时间,下午结束时间),所以总和肯定会为每个返回不同的值的列。此外,每只狗的值都不同,并且与我期望的相对值一致,因此步行较多的狗比步行较少的狗返回更大的值。因此,看起来总和可能有效,只是以某种方式为每列返回相同的值。

顺便说一句,在开发 Rails 3.2.3、ruby 2.0、SQLite 中运行它。

4

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 回答