【问题标题】:data retrieval between two DateTime object with equal intervals Rails两个等间隔的 DateTime 对象之间的数据检索 Rails
【发布时间】:2014-11-15 12:05:11
【问题描述】:

我是 Rails 新手,我认为这是常见问题。目前,我在 Rails 中有两种不同的方法来获取今天和一周的数据。然后我过滤数据以找到今天方法中每小时的最大值和星期方法中每天的最大值,并相应地返回 json 对象。

现在我想从我的 rest api 中删除约束,通过编写一个方法来查找两个日期之间的差异并找到它们之间的间隔,差异可能是分钟、小时、天等。然后差异会被分成 10 个相等的部分并找到提取该特定部分的最大值。例如,如果零件间隔为 10 分钟,那么我需要每个零件的最大值,类似几个小时或一天。

发现差异很容易,但我不明白如何进一步处理,请任何指点,我坚信很多人都遇到过类似的问题,如果我能在 Rails 中获得任何好的指针,那就太好了。

我的日期时间格式是

Mon Jun 23 16:00:06 2014 GMT 0200

【问题讨论】:

  • “我不明白如何处理未来”,你的意思是你不知道如何解决问题?
  • 对不起,我的意思是进一步,详细的意思是,我如何决定零件应该在几分钟、几小时或几天内,因为我不想要超过 10 个零件,我希望我清楚

标签: ruby-on-rails ruby datetime


【解决方案1】:

只要几秒钟的准确度就足够了,您可以通过简单的减法来比较两个 DateTime 对象:

a = DateTime.new(2014) # Wed, 01 Jan 2014 00:00:00 +0000
b = DateTime.new(2015) # Thu, 01 Jan 2015 00:00:00 +0000
diff = b.to_i - a.to_i # in seconds.
puts "2014 has #{ (diff / 1.day).round } days"

ActiveSupport 为我们提供了将整数转换为时间的方法 这使得添加十分之一的差异非常容易

puts "a tenth into 2014 is #{ a + (diff / 10).seconds }"

您可以使用将一系列 DateTime 对象传递到 where 子句:

Foo.where(created_at: a..(a + (diff / 10).seconds))

所以总结一下:

class Foo < ActiveRecord::Base

    # Get the maximum value of bar column 
    #   for divided into periods between a start and end date.
    # @param start [DateTime]
    # @param finish [DateTime]
    # @param divisor [Integer] the number of parts to split into
    # @return array 
    #   will always have divisor number of elements
    #   elements may be empty 
    def maximum_bar_values_for_period(start, finish, divisor = 10)
        diff = finish.to_i - start.to_i
        part = diff / divisor
        (0..divisor).map do |i|
            start_period = start + ((i - 1) * part).seconds
            end_peroid =  start_period + part.seconds
            Foo.where(created_at: start_period..end_peroid).maximum(:bar)
        end
    end
end

【讨论】:

  • 请注意,这将创建 10 个数据库查询,这对性能来说不是很好。如果您想在一个查询中执行此操作,您可能需要自己编写 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2015-12-23
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多