选择start_date和end_date跨越一年中某一天的记录,无论年份如何

时间:2015-07-24 09:36:19

标签: ruby-on-rails ruby

我正在努力找到一种方法来解决这个问题。我有一组许可证记录,已经从数据中加载。每个都有一个start_date和end_date字段。我想select那些跨越给定日期的人,在任何一年。 (当我说他们越过那个日期时,我的意思是start_date在日期之前,end_date在日期之后)。

这是我目前正在做的笨重的方式,它使用不同年份的同一日期的数组,可追溯到10年前和10年前。

target_date = Date.parse("30-09-2015")
date = target_date - 10.years
dates = []
while date < 10.years.from_now
  dates << date
  date += 1.year
end
#now have an array `dates` of Date objects holding eg ["30-09-2005", 30-09-2006", ... "30-09-2025"]
crossing_licenses = licenses.select{|license| dates.detect{|date| license.start_date < date && license.end_date > date}}

这样可行,但感觉必须有一种更优雅的方式来做到这一点。谢谢,Max

请注意:我已经开始收集许可证,所以我不是在寻找如何进行SQL查询来获得这些许可证。

编辑:潜在的问题 - 注意从前一年开始的许可证,例如从“10-10-2014”到“2015年10月30日”。

1 个答案:

答案 0 :(得分:1)

我会说你不需要一个带日期的数组来执行此操作:

target_date = Date.parse("30-09-2015")

crossing_licenses = licenses.select do |license|
  return false if license.end_date < 10.years.ago
  return false if license.start_date > 10.from_now

  (license.start_date..license.end_date).any? do |date|
    date.month == target_date.month && date.day == target_date.day
  end
end

请确保start_dateend_date实际上是Date个对象,而不是Time。如果是这样,最好将它们转换为日期,否则你将获得巨大的范围。