2

我正在尝试重现我在 ActiveRecord 中使用的这个 SQL 查询:

Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])

但由于我将所有内容都转换为 DataMapper,我一直在寻找一种方法来做到这一点......

任何人都可以帮忙吗?

4

1 回答 1

12

我想这是因为它被标记为您已加载 ActiveSupport 的“ruby-on-rails”。这将提供 Time#end_of_month 辅助方法。有了它,您可以将查询重写为:

time = Date.new(year, month).to_time

Post.all(:created_at => time..time.end_of_month)

这不仅更简单,它还消除了查询中的原始 SQL(因此查询更容易移植到 RDBMS 以外的东西),最重要的是它可能会比其他查询执行得更好。EXTRACT数据库可能必须执行全表扫描以从 created_at 中的每一行中提取年份和月份,然后将它们与您的预期值进行比较。如果您有一个大型数据集,这可能会给您的数据库带来很大的负担。但是,如果您的 created_at 列被索引,则上述方法相比之下应该非常有效。

于 2010-02-15T05:20:27.823 回答