修改日期以启用mysql DateTime格式的搜索

时间:2013-05-28 19:06:50

标签: sql ruby-on-rails ruby date time

我有一个用户界面,我们在其中选择日期范围,然后执行查询以检查该范围内的订单。

所以接受的有效格式是

a)2013-04-01 17:00:00 - 2013-04-16 18:00:00

b)2013-04-01 17:00:00 - 2013-04-16

c)2013-04-01 - 2013-04-16

我将它拆分为ruby,给我start_date和end_date。我没有触及开始时间,因为它已准备好进行sql查询。

但是必须修改end_date,因为执行远程查询created_at BETWEEN '2013-04-01 17:00:00' AND '2013-04-16'不会给出结果集中应包含的第16个结果。 (与2013-04-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行答案,而不是更多)

1 个答案:

答案 0 :(得分: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_date设置为end_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

当用户输入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?