计算两个日期时间之间的时间-ActiveRecord/SQL/Heroku



使用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)

最新更新