比较DateTime的时间部分?

时间:2014-10-15 17:04:59

标签: sql ruby-on-rails ruby datetime ruby-on-rails-4

我的餐厅有hours。每个Hour对象为open_atclose_at时间。如何比较db中DateTime的时间部分和Time.now的时间?

hours.today.where("open_at <= ? AND close_at >= ?", Time.now, Time.now).any?

编辑:我试过改写这个问题:

我有一个Hour对象h,其属性close_at的类型为Time。如何将数据库中的时间部分与Time.current进行比较?

2.1.3 :014 > h.close_at.class => Time 2.1.3 :015 > h.close_at => 2000-01-01 22:44:00 UTC 2.1.3 :016 > Time.current => Wed, 15 Oct 2014 17:32:27 UTC +00:00 2.1.3 :017 > h.close_at >= Time.current => false 我希望最后一行返回true。 (22:44> 17:32)

2 个答案:

答案 0 :(得分:0)

我相信您正在尝试检查今天是否有任何时间已经开放并且从现在开始的任何时间关闭:

假设这样,你可以通过以下方式完成所需:

Hour.where(:open_at => (Time.current.midnight)..(Time.current) , :closed_at => (Time.current)..(1000.years.from_now) ).any?

基本上关键是,你可以在where子句中传递范围。

如果您没有任何上限或下限,您可以随时使用它来定义范围:

1000.years.from_now
1000.years.ago
例如,从现在开始的任何时间都可以表示为:

Time.current..(1000.years.from_now)

显然你不会制作一款需要从现在起来存储1000年的应用程序!我相信这种方法应该适用于你的情况。

编辑:

我很抱歉误解了你的问题。这是问题的解决方法:

closing_time = h.close_at
# closing_time => 2000-01-01 22:44:00 UTC 
closing_time = Time.current.midnight + closing_time.hour.hours + closing_time.min.minutes + closing_time.sec
#this shifts the closing date_time to the current date, without affecting hours, minutes and seconds, So,
# closing_time => 2014-10-15 22:44:00 UTC 
current_time = Time.current
# current_time => Wed, 15 Oct 2014 17:32:27 UTC +00:00 
closing_time >= current_time
#=> returns true (because 22:44 > 17:32 , with other things remaining the same.)

希望有所帮助:)

答案 1 :(得分:0)

如果你想比较时间IN SQL,你是否使用MySQL,你可以使用它的TIME()函数,来自docs:

  

提取时间或日期时间表达式expr的时间部分并将其作为字符串返回。

所以你可以这样做:

hours.today.where("TIME(open_at) <= ? AND TIME(close_at) >= ?", Time.now, Time.now).any?