如何使用PostgreSQL和Ruby on Rails存储持续时间?

时间:2017-10-07 14:50:22

标签: ruby-on-rails ruby postgresql

我们希望用户注册他们在某些事情上工作的时间。例如,假设我已经为项目工作了两个半小时,那么我想用2:30填写表单输入 - 两小时三十分钟 - 并将其存储在数据库中。同样的1:45 - 一小时四十五分钟 - 带来另一个案例。 然后,我们将使用该信息来计算应分配给该活动的金额。

例如,如果一小时是10美元,那么:

  • 15分钟 - > $ 2.5
  • 30分钟 - > $ 5'/ LI>
  • 1小时 - > 10 $
  • 2:30 - > $ 25

我们应该将2:30转换为秒来将其存储在数据库中吗?或者有更好的解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

最好避免离散值的浮点数。因为对您来说最小的有意义值是分钟,这就是我建议存储时间的内容。存储秒数会提供不必要的分辨率(更多数据),存储小时会导致您存储小数或意味着您没有足够的精度。 / p>

如何存储值取决于您所使用的Rails版本。如果是5.1,则Postgres中的interval column类型具有原生支持。如果你拥有它我会使用它,但如果你不这样做它不是一个破坏者,只需使用一个整数列。

答案 1 :(得分:1)

怎么样?

Time.parse("0:15").seconds_since_midnight / 3600 * 10 => 2.5

我个人会存储秒数而不是时间类型。

答案 2 :(得分:0)

使用Postgres我会考虑使用区间数据类型的ideao,例如:

t=# with t(v) as (values('2:30'::text),('2 12:31:00'::text),('38 hours 21 minutes 4 seconds'))
select v, v::interval,justify_interval(v::interval),extract(epoch from v::interval) from t;
               v               |        v        | justify_interval | date_part
-------------------------------+-----------------+------------------+-----------
 2:30                          | 02:30:00        | 02:30:00         |      9000
 2 12:31:00                    | 2 days 12:31:00 | 2 days 12:31:00  |    217860
 38 hours 21 minutes 4 seconds | 38:21:04        | 1 day 14:21:04   |    138064
(3 rows)