Rails 5如何在postgres中保存两个日期时间之间的小时和分钟差异?

问题描述 投票:1回答:2

我的表有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 ??

谢谢。

ruby-on-rails postgresql rails-activerecord timestamp-with-timezone
2个回答
1
投票

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。

在任何情况下,字符串都可能是错误的方法,除非你真的喜欢随时随地解析字符串。


0
投票

您可以将duracion保存为浮点类型,其中duracion等于final_time - created_at之类的值,这个值将是以秒为单位的差值。然后,您可以使用这些值执行算术运算,并始终将其转换回分钟,小时或任何您需要的值。

© www.soinside.com 2019 - 2024. All rights reserved.