2013-11-24 54 views
-1

我有一个包含日期的Ruby文件中的散列数组,我需要能够根据需要使用Ruby搜索和显示散列,使用FROM和TO日期。我怎么去解决这个问题?目前为止我还没有看到日期格式的日期可以搜索它们。有什么建议么?如何使日期对象在一个范围内搜索

这是我到目前为止已经试过了之前的搜索格式:

def reporting_display 
    while true 
    puts "Please enter a date range (yyyy-mm-dd) FROM and TO" 
    puts "FROM:" 
    get_from = gets.chomp 
    if validate_date(get_from) 
     @from = Date.parse(get_from) 
     puts "TO:" 
     get_to = gets.chomp 
     if validate_date(get_to) 
     @to = Date.parse(get_to) 
     puts "Please wait" 
     break 
     else 
     puts "Invalid input" #may be able to remove this and rely on if from's Invalid input 
     end 
    else 
     puts "Invalid input" 
    end 
    end 

    @from 
    @to 
end 

来查询我尝试了数据:

def query_sales_csv 
    CSV.foreach('sales_data.csv', headers: true) do |row| 
    @sales_from_csv << row 
    end 
    @sales_from_csv 
    @sales_from_csv.each do |order| 
    if [@[email protected]].include?(order[:date]) 
     puts "Date: #{order[:date]} - Units Sold: #{order[:units_sold]} - Gross Profit: $#{order[:gross_profit]} - COGS: $#{order[:cogs]} - Net Profit: $#{order[:net_profit]}" 
    else 
     puts "Error: Invalid Range" 
    end 
    end 
end 
+1

哈希如何看起来像..你需要提供一些原始数据,你一直在尝试 – Bijendra

+0

@ CDub和@Bijendra我添加了我正在使用的代码。如果你需要其他东西,请让我知道,谢谢! – John

回答

1

假设你的散列看起来像这样

dates = [{:name =>"jan", :val => Date.new(2013, 1, 1)}, {:name => "feb", :val => Date.new(2013, 2, 1)}, {:name => "mar", :val => Date.new(2013, 3, 1)}] 

那么下面的find_all将会起作用

earliest = Date.new(2013, 1, 15) 
latest = Date.new(2013, 3, 15) 
dates.find_all{|h| h[:val] >= earliest and h[:val] <= latest} 

更新:现在有代码,行

if [@[email protected]].include?(order[:date]) 

是错误的,它应该是

if (@[email protected]).include?(order[:date]) 

明白为什么使用内部评级法来看看

[Date.new(2013, 1, 1)..Date.new(2013, 1, 2)].class # Array 
[Date.new(2013, 1, 1)..Date.new(2013, 1, 2)][0].class # Range 

vs

(Date.new(2013, 1, 1)..Date.new(2013, 1, 2)).class # Range 

您的代码正在检查数组以查看它是否包含日期。它没有,它只包含一个单一的元素,范围。新代码是日期范围。