我有两个时间列存储在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
时,它无法正常工作。
如何让它不包括日期,只是比较时间?
答案 0 :(得分:4)
也许你想要这样的东西:
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
答案 1 :(得分:4)
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")
#=> #<DateTime: 2018-06-07T09:00:00+00:00 ((2458277j,32400s,0n),
# +0s,2299161j)>
close_time = DateTime.parse("17:00")
#=> #<DateTime: 2018-06-07T17:00:00+00:00 ((2458277j,61200s,0n),
# +0s,2299161j)>
然后
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")
#=> #<DateTime: 2018-06-07T01:00:00+00:00 ((2458277j,3600s,0n),
# +0s,2299161j)>
然后
close_time.strftime(TIME_FMT)
#=> "010000"
store_open_now?(open_time, close_time)
#=> true
答案 2 :(得分:2)
您可以使用
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
值,这就是你想要的。
然后,您可以使用与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
相同的逻辑来获取您要查找的获取值。
示例:
datetime
您可以更改小提琴中的架构构建,以测试所需的CASE WHEN
值。
请注意,如果您有一个包含午夜时间的逻辑,则必须对此进行slice
逻辑,否则它将失败并返回0,而它应返回1.
答案 3 :(得分:0)
您可以利用范围以及如何比较数字字符串
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'))