【问题标题】:SQL or RoR - Finding the interval period for a given start date and frequencySQL 或 RoR - 查找给定开始日期和频率的时间间隔
【发布时间】:2020-07-11 15:15:47
【问题描述】:

存在一个博客模型,它具有 creation_dateinput_frequencyinput_limit。输入频率可以是每天、每周、每月(忽略当月的天数,但在下个月的当天重置)或年(忽略一年中的天数,但在下个月的同一天重置)年)。在由input_frequencycreation_date 确定的给定时间段内,用户最多可以发帖到集合input_limit

例如,说博客有 creation_date 1 月 6 日,input_frequency 是每月一次,input_limit 是 4 次。

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

  1. 我当前间隔的开始日期和结束日期是什么时候? (答案示例:6 月 6 日至 7 月 6 日)
  2. 我的输入限制重置还剩多少天? (26 天)
  3. 在当前区间内发了多少帖子(得到#1 Posts.where(created_at: start_interval..end_interval) 后我可以轻松回答)。

日、周、月和年间隔之间的策略似乎必须有所不同。

例如,对于每周间隔,计算间隔似乎更难,因为我必须从creation_date 计算今天的天数,然后做模数并从当天减去该模数以确定 start_interval并在其中添加 7 以确定 end_interval - 是否有任何库可以做我想做的所有事情,还是我必须自己提出所有计算?

【问题讨论】:

  • 7.days.ago7.days.from_nowDate.today.beginning_of_week等方法对你有用吗?

标签: sql ruby-on-rails


【解决方案1】:

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

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2018-07-26
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多