我正在尝试重现我在 ActiveRecord 中使用的这个 SQL 查询:
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
但由于我将所有内容都转换为 DataMapper,我一直在寻找一种方法来做到这一点......
任何人都可以帮忙吗?
我正在尝试重现我在 ActiveRecord 中使用的这个 SQL 查询:
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
但由于我将所有内容都转换为 DataMapper,我一直在寻找一种方法来做到这一点......
任何人都可以帮忙吗?
我想这是因为它被标记为您已加载 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 列被索引,则上述方法相比之下应该非常有效。