Хранить временной интервал в PostgreSQL от Rails - PullRequest
3 голосов
/ 22 июня 2011

Мне нужно хранить инверсию времени в PosgreSQL.Данные будут передаваться из Ruby on Rails.

Скажем, PizzaHut принимает заказы с 9:00 до 18:00.

Я создал следующую миграцию:

class AddOrderTimeAndDeliveryTimeToMerchants < ActiveRecord::Migration
  def self.up
    add_column :merchants, :order_time, :interval
  end

Я прочитал документацию , и теперь у меня есть следующий код:

Merchant.create( :delivery_time => "9:00 18:00" )

При выполнении я получаю следующее сообщение об ошибке:

PGError: ERROR:  invalid input syntax for type interval: "9:00 18:00"

Каксделать это правильно?

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Я не думаю, что интервал действительно то, что вы хотите для этого. Интервал представляет собой временной интервал без каких-либо конкретных конечных точек; например, вы добавляете интервал к существующему времени, чтобы получить другое время. Тебе было бы лучше с двумя разными временами:

add_column :merchants, :order_from, :time, :null => false
add_column :merchants, :order_to,   :time, :null => false

Затем, если по какой-то причине вам нужно знать, сколько часов они открыты для доставки, вы можете построить интервал, вычитая :order_from из :order_to.

Если вы действительно должны использовать интервал, тогда вам нужно построить значение примерно так:

:delivery_time => "interval '11 hour'"

Обратите внимание, как это показывает, что интервал не является конкретным диапазоном времени от A до B , это просто интервал времени определенной длины (без заданных конечных точек) .

0 голосов
/ 23 июня 2011

Вероятно, вам нужно время без часового пояса, поскольку если домино в Нью-Йорке открывается в 9:00 по местному времени, а домино в Калифорнии также открывается в 9:00 по местному времени, то время с часовым поясом не будет работать должным образом .

То, что вы, вероятно, хотите, это одна из двух вещей. либо два раза время начала и окончания, либо время начала и интервал. Я бы предложил два раза, но выбор за вами. Обратите внимание, что вы можете сделать интервал из двух раз, вычитая одно из другого.

select '09:00:00'::time - '05:00:00'::time;
 ?column? 
----------
 04:00:00
...