我的表有3列:数据类型时间戳,
|created_At | final_time| duracion(difference between created at and final_time)
| | |
列差异应保存小时和分钟的差异,格式为HH:MM
这是我的控制器:
def horario
horario.update(duracion: params[:duracion]) // this params is "00:59"
end
但在表Horarios中,在duracion列中我有这样的:
2017-12-24 03:59:00
所以我想保存00:59(59分钟),但postgres保存所有当前日期,并增加3个小时。我想保存,所以将来我将能够tu sum column duracion。或者我应该更改此列的数据类型?在这种情况下,你建议我使用哪种数据类型来保存HH:MM ??
谢谢。
Rails 5在某种程度上支持PostgreSQL的interval
type。你可以用通常的方式创建interval
列,它们将在db/schema.rb
中正确表示。您也可以通常的方式为它们分配值,以便您可以这样说:
model.some_interval = '6 hours'
并在数据库中获取06:00:00
。但是,Ruby或Rails中没有任何内容可以正确表示时间间隔(我们只有各种时间戳和日期类),所以当这个时间间隔来自数据库时,你手上就会有一个字符串,即:
> model = Model.find(some_id)
> model.some_interval.class
=> String
所以你可能最终不得不在Ruby中手动解析一些字符串。对于像'6 hours'
这样的简单间隔,这很容易,但是像'6 years 23 days 11 hours'
那样更复杂的间隔也不会那么容易。
如果你只是在数据库中使用你的时间间隔,那么interval
将是自然而简单的,你可以这样说:
select some_timestamp + some_interval
和
where some_timestamp + some_interval < some_other_timestamp
一切都会好起来的。
但是,如果您需要在Ruby中使用间隔,那么您可能最好将间隔存储为整数列中的秒数(或您需要的任何分辨率)。然后你可以这样说:
where some_timestamp + (some_interval_in_seconds || 'seconds')::interval < some_other_timestamp
在数据库内部
some_time + model.some_interval_in_seconds
回到Ruby。
在任何情况下,字符串都可能是错误的方法,除非你真的喜欢随时随地解析字符串。
您可以将duracion
保存为浮点类型,其中duracion
等于final_time
- created_at
之类的值,这个值将是以秒为单位的差值。然后,您可以使用这些值执行算术运算,并始终将其转换回分钟,小时或任何您需要的值。