我有一些表:
online | offline
10:32 | 11:06
12:28 | 13:04
14:07 | NULL
如您所见, - 用户当时没有离线(假设现在是14:15)。我需要获得所有用户在线的持续时间。如果用户当前没有离线 - 我需要区别Time.now - online。
在我的ruby代码中,我创建了函数:
def offline_datetime
if offline.nil? then Time.current else offline end
end
没关系,但是如果我有很多记录就会这么慢......我怎么能通过数据库来做呢?
答案 0 :(得分:3)
我认为这不会有任何区别。即使有数百条记录,你还有一个额外的测试,每条记录只有零,而且只有一次'Time.now'计算。与模型对象的生成相比,几乎没有任何东西。您可以计算存储的差异,然后让数据库计算总和。但是我只会在必要的情况下这样做(如果没有破坏,不要调整性能)。
修改的 如果您必须多次计算在线时间的总和,则应在存储离线时间戳时预先计算在线时间:
diff
作为integer
,以分钟为单位。Model.sum("diff")
答案 1 :(得分:1)
我认为在那个位置,做两个查询将是easyes解决方案。一个排除数据集,其中offline是NULL,另一个是只抓取这些数据集。那么你可以使用像这样的CURRENT_TIMESTAMP变量(它总是包含实际时间的时间映射):
Model.where("offline IS NULL").sum("CURRENT_TIMESTAMP-online")
然后你可以添加first和secound查询的结果。也许使用方法功能:
def self.your_method_name_here
secounds=0
secounds+=Model.where("offline IS NOT NULL").sum("offline-online").to_i
secounds+=Model.where("ofline IS NULL").sum("CURRENT_TIMESTAMP-online").to_i
secounds
end
有可能在一个查询中执行此操作,但我认为这是可行的!