我正在努力找到一种方法来解决这个问题。我有一组许可证记录,已经从数据中加载。每个都有一个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日”。
答案 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_date
和end_date
实际上是Date
个对象,而不是Time
。如果是这样,最好将它们转换为日期,否则你将获得巨大的范围。