2013-05-28 41 views
0

我有一個用戶界面,其中我們選擇一個日期範圍,然後執行查詢來檢查該範圍內的訂單。修改日期以啓用在MySQL日期時間格式搜索

所以接受的有效格式是

一)2013年4月1日17:00:00 - 2013年4月16日18:00:00

二)2013年4月1日17: 00:00 - 2013年4月16日

三)2013年4月1日 - 2013年4月16日

我在紅寶石拆分它給我START_DATE日期和結束日期。我不必觸摸開始時間,因爲它已經準備好了sql查詢。

但是,end_date必須被修改,因爲執行一個範圍查詢created_at BETWEEN '2013-04-01 17:00:00' AND '2013-04-16'不會給我的結果中應包括第16個結果集。 (因爲它比作2013年4月16日00:00:00)

因此,這是工作的解決方案,我想出了

end_date = Time.parse(end_date).strftime("%T")=="00:00:00" ? (end_date.to_s) + " 23:59:59" : end_date.to_s 

是否有更好的方法來做到這一點作爲上述外觀很混亂? (展望或1-2線的答案,而不是更多)

回答

4

你可以使用DateTime.parse(str)方法:

date_str = "2013-04-16" 
date = DateTime.parse(date_str) 
#=> Tue, 16 Apr 2013 00:00:00 +0000 

date_time_str = "2013-04-16 18:00:00" 
date = DateTime.parse(date_time_str) 
#=> Tue, 16 Apr 2013 18:00:00 +0000 

然後你可以測試.hour(或.minute),如果沒有時間設置end_dateend_of_day選擇:

end_date = (date.hour == 0 && date.minute == 0) ? date.end_of_day : date 

小的改進:如果解析日期等於這個日期的開始(無時/分/秒),您可以測試:

date = DateTime.parse("2013-12-12") 
#=> Thu, 12 Dec 2013 00:00:00 +0000 
date.beginning_of_day 
#=> Thu, 12 Dec 2013 00:00:00 +0000 
end_date = (date.beginning_of_day == date) ? date.end_of_day : date 
#=> Thu, 12 Dec 2013 23:59:59 +0000 

要當用戶進入一個DateTime像2013-04-16 00:00:00解決問題,你可以使用.include?檢查,如果字符串包含「00:00:00」部分:

date_str = "2013-04-16 00:00:00" 
date = DateTime.parse(date_str) 

end_date = date if date_str.include?('00:00:00') # means the user explicitly wants the time at 00:00 and 00 second 
end_date ||= (date.beginning_of_day == date) ? date.end_of_day : date # set end_date if end_date.nil? 
+0

看起來好多了,而且容易閱讀。現在試試irb。 –

+0

@PraktikBothra做到了嗎? – MrYoshiji

+0

適用於irb ..請參閱爲什麼它不應該在rails應用程序中工作。 –