SQL或RoR-查找给定开始日期和频率的间隔周期

SQL或RoR-查找给定开始日期和频率的间隔周期,sql,ruby-on-rails,Sql,Ruby On Rails,存在一个博客模型,它具有创建日期,输入频率,以及输入限制。输入频率可以是每天、每周、每月(忽略该月内的天数,但在下一个月的下一个月的第二天重置)或年(忽略该年内的天数,但在下一年的同一天重置)。在由input\u frequency和creation\u date确定的给定时间段内,允许用户发布到设置的input\u limit 例如,该博客的创建日期为1月6日,input\u频率为每月,input\u限制为4 我想知道与今天日期相关的三件事(假设是6月10日): 我当前间隔的开始和结束日期是什

存在一个博客模型,它具有
创建日期
输入频率
,以及
输入限制
。输入频率可以是每天、每周、每月(忽略该月内的天数,但在下一个月的下一个月的第二天重置)或年(忽略该年内的天数,但在下一年的同一天重置)。在由
input\u frequency
creation\u date
确定的给定时间段内,允许用户发布到设置的
input\u limit

例如,该博客的创建日期为1月6日,
input\u频率为每月,
input\u限制为4

我想知道与今天日期相关的三件事(假设是6月10日):

  • 我当前间隔的开始和结束日期是什么?(示例答案:6月6日至7月6日)
  • 在输入限制重置之前还有多少天?(26天)
  • 在当前时间间隔内发表了多少篇文章(在获得#1
    posts.where(创建时间:start\u interval..end\u interval)
    后,我可以轻松回答)
  • 日、周、月和年间隔之间的策略似乎必须有所不同


    例如,以每周为间隔,计算时间间隔似乎比较困难,因为我必须计算今天的天数是从
    创建日期开始的
    ,然后进行模运算,然后从当天减去模运算来确定开始时间间隔,再加上7来确定结束时间间隔-是否有任何库可以做我想做或我想做的事情必须自己完成所有的计算吗?

    下面的代码回答了我的3个基本问题。。。(虽然可能不是最有效的方式,但这是一个答案…)


    7.days.ago
    7.days.from\u now
    Date.today.start\u of\u week
    这样的方法对你有用吗?
    # assumes that date passed will always be later than start_date
    def post_interval_start_date(date = Date.today)
        case input_frequency
        when "entire_duration"
            return creation_date
        when "daily"
            return date
        when "weekly"
            return date - ((date-creation_date).to_i%7).days
        when "monthly"
            # weird math here to account for months with different number of dates
            months_apart = (creation_date.year * 12 + creation_date.month) - (date.year * 12 + date.month)
            months_apart = months_apart-1 if start_date.mday > date.mday
            return creation_date+months_apart.months
        when "yearly"
            return Date.new(date.yday < start_date.yday ? date.year-1 : date.year, creation_date.month, creation_date.mday)
        end
    end
    
    def post_next_interval_start_date
        case input_frequency
        when "entire_duration"
            return post_interval_start_date
        when "daily"
            return post_interval_start_date+1.day
        when "weekly"
            return post_interval_start_date+1.week
        when "monthly"
            return post_interval_start_date+1.month
        when "yearly"
            return post_interval_start_date+1.year
        end
    end
    
    def post_left_this_period
        input_limit - post_posted_in_period
    end
    
    def post_posted_in_period
        posts.where('post_date >= ?', post_interval_start_date()).count
    end
    
    # answer #1 (i didn't end up needing end date for what i was doing):
    blog.post_interval_start_date() 
    
    # answer #2 
    (blog.post_next_interval_start_date()-Date.today).to_i
    
    # answer #3
    blog.post_posted_in_period