【问题标题】:SQL query for finding finished records published for different time periods用于查找不同时间段发布的已完成记录的 SQL 查询
【发布时间】:2015-04-10 07:16:44
【问题描述】:

所以假设有一个博客,并且所有者可以在不同的时间段发布他的帖子,例如:

  • 1 周
  • 2 周
  • 1个月
  • 2 个月
  • 6 个月

之后应该删除帖子。

时间段设置在名为time_period的列中,其中0代表1周,1代表2周等等

创建日期设置在created_at 列中。

所以我需要编写一个 sql 查询来获取所有已过期发布日期的记录,我可以看到两种方法来解决这个问题:

1) 编写一个包含很多条件的查询,例如:

.where("(time_period = 0 AND created_at <= :one_week_ago) OR
        (time_period = 1 AND created_at <= :two_weeks_ago)",
         one_week_ago: Time.now - 1.week, 
         two_weeks_ago: Time.now - 2.weeks)

但对于所有条件

2) 或者简单地获取所有记录(使用find_each 方法)并检查每个记录是否满足要求

我可能会选择第二个,但我只是想知道是否有一种有效的方法可以针对这种情况编写查询?也许是一些数据库功能或类似的东西?

【问题讨论】:

  • 如果您只在该列中存储周数,事情会更容易(即“4”代表“1个月”,“8”代表两个月,依此类推)。然后你可以做created_at &lt;= current_date - interval '1 week' * time_period
  • 是的,我应该考虑一下。谢谢你的建议

标签: sql ruby-on-rails database postgresql


【解决方案1】:

如果我这样做了,那么为了我自己的理智,我会添加一个日期/日期时间字段来存储实际的到期时间,您可以简单地将其与当前时间进行比较以查看帖子是否已过期。这将通过 before_save 回调中的 time_period 选项设置。

class Post

  before_save :set_expiry_date

  def set_expiry_date
    self.expiry_date = self.calculate_expiry_date
  end

  def calculate_expiry_date
    #logic which takes time_period and multiplies it by weeks or whatever you do
  end

现在您可以查看数据库并查看哪些帖子已过期。保持简单。

【讨论】:

  • 出于某种原因我什至没有考虑过 -_- 谢谢
【解决方案2】:

我同意@a_horse_with_no_name。但是,如果这不是一个选项,您可能可以执行以下操作:

where created_at <= case time_period when 0 then :one_week_ago
                                     when 1 then :two_weeks_ago
                                     ...
                    end 

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2023-03-11
    • 2023-03-25
    • 2021-02-09
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多