找出当前时间是否介于两次之间
我有两个时间列存储在Postgresql数据库中: open_time
和close_time
。 我试图找出当前时间,忽略日期,是否在两次之间,忽略了日期。
此代码比较日期和时间:
current_time = Time.now if current_time.between?(store.open_time, store.close_time) puts "IN BETWEEN" end
例如,当current_time # => 2018-06-06 23:59:49 -0600
和open_time # => 2000-01-01 22:59:00 UTC
时,它不起作用。
如何让它不包括日期,只是比较时间?
也许你想要这样的东西:
current_time = Time.now open_time = store.open_time close_time = store.close_time current_time -= current_time.beginning_of_day open_time -= open_time.beginning_of_day close_time -= close_time.beginning_of_day if current_time.between?(open_time, close_time) puts "IN BETWEEN" end
要么
current_time = Time.now open_time = store.open_time close_time = store.close_time current_time = [current_time.hour, current_time.min, current_time.sec] open_time = [open_time.hour, open_time.min, open_time.sec] close_time = [close_time.hour, close_time.min, close_time.sec] if open_time <=> current_time == -1 and current_time <=> close_time == -1 puts "IN BETWEEN" end
require 'time' TIME_FMT = "%H%M%S" def store_open_now?(open_time, close_time) nt = Time.now.strftime(TIME_FMT) ot = open_time.strftime(TIME_FMT) ct = close_time.strftime(TIME_FMT) ot <= ct ? (nt >= ot && nt <= ct) : (nt >= ot || nt <= ct) end
在我写的时候,时间现在是午夜过了约32分钟。
Time.now.strftime(TIME_FMT) #=> "003252"
假设
open_time = DateTime.parse("09:00") #=> # close_time = DateTime.parse("17:00") #=> #
然后
open_time.strftime(TIME_FMT) #=> "090000" close_time.strftime(TIME_FMT) #=> "170000" store_open_now?(open_time, close_time) #=> false
现在假设开放时间相同,但关闭时间稍晚。
close_time = DateTime.parse("01:00") #=> #
然后
close_time.strftime(TIME_FMT) #=> "010000" store_open_now?(open_time, close_time) #=> true
你可以使用CAST()
你的datetime
time
,
cast(tbl_store.open_time as time) as SomeVariable cast(tbl_store.close_time as time) as SomeOtherVariable
那只会给你time
而不是你必须开始的完整datetime
值,这就是你想要的。
然后,您可以在curtime() between
使用与您要curtime() between
的get值相同的逻辑。
例:
SELECT CAST(tbl_store.open_time as TIME) as open_time, CAST(tbl_store.close_time as TIME) as close_time, CURTIME() BETWEEN (cast(tbl_store.open_time as TIME)) AND (cast(tbl_store.close_time as TIME)) as time_between FROM tbl_store
工作SQL小提琴
您可以更改小提琴中的架构构建以测试所需的datetime
值。
请注意,如果您有一个包含午夜时间的逻辑,则必须对该逻辑进行CASE WHEN
逻辑,否则它将失败并返回0,而它应返回1。
您可以利用范围以及数字字符串的比较方式
r = Range.new('09:00', '18:00') r.include?('08:59') # => false r.include?('09:01') # => true r.include?('18:01') # => false
然后我们可以使用
open_hours_range = Range.new(open_time.strftime('%R'), close_time.strftime('%R')) shop_open? = open_hours_range.include?(Time.now.strftime('%R'))