Узнайте, если текущее время между двумя - PullRequest
0 голосов
/ 07 июня 2018

В базе данных 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.

Как мне сделать так, чтобы не включать даты, а просто сравнить время?

Ответы [ 4 ]

0 голосов
/ 07 июня 2018
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
0 голосов
/ 07 июня 2018

Вы можете 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

Рабочая SQL-скрипта

Вы можете изменить сборку схемы в скрипте, чтобы протестировать нужные значения datetime.

Обратите внимание, что если у вас когда-либо будетлогика, которая будет включать полночное время, вам придется создать CASE WHEN логику против этого, иначе она потерпит неудачу и вернет 0, тогда как она должна вернуть 1.

0 голосов
/ 07 июня 2018

Вы можете использовать диапазоны и сравнить числовые строки

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'))
0 голосов
/ 07 июня 2018

Возможно, вы хотите что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...