使用Rails ActiveRecord,我想计算同一行中两个日期时间字段之间的时间。这两个约会时间之间的差异可能从几秒到几个小时,也可能跨越午夜。表示差异的秒数是很好的。
我同时使用sqlite和postgress。
使用sqlite,下面的计算结果仅为0。("solved_at"one_answers"started_at"都是"datetime"类型,"solved_at"晚于"started_at")
SELECT (datetime(solved_at) - datetime(started_at)) FROM "schedules";
类似这样的东西:
dur_sql = "strftime('%s',solved_at) - strftime('%s',started_at)" unless Rails.env.production? # sqlite in dev and test modes
dur_sql = "extract( epoch from solved_at - started_at)" if Rails.env.production? # heroku with postgres
select_clause = "count(*) as count, env, case_type, date(started_at) as started_at_date, " + "AVG(#{dur_sql}) as avg_dur, MIN(#{dur_sql}) as min_dur, MAX(#{dur_sql}) as max_dur"
group_clause = "env, case_type, date(started_at)"
where_clause = ...
grouped_stuff = Schedule.select( select_clause ).where( where_clause ).group( group_clause )
下面的内容不是性能有效的,但它应该会给您带来预期的结果。
Schedule.all.collect{|s| s.solved_at - s.started_at}
建议的方法是在数据库级别的查询本身中执行此操作。
在Ruby中,schedule.solved_at - schedule.started_at
将返回以秒为单位的时间距离
在PostgreSQL中,您可以通过执行来获得时差
SELECT AGE(TIMESTAMP date1, TIMESTAMP date2);
这会给出一个间隔,以便将其转换为您执行的秒数:
EXTRACT(EPOCH FROM interval)
示例:
SELECT EXTRACT(EPOCH FROM AGE(TIMESTAMP '1957-06-13 13:43:22', TIMESTAMP '1965-03-12 10:00:00'));
date_part
------------
-244131398
(1 row)