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



我们希望用户记录他们处理某件事的时间。例如,假设我为一个项目工作了两个半小时,然后我想用2:30(两小时三十分钟)填写表单输入并将其存储在数据库中。同样1:45——一小时四十五分钟——再提起一次诉讼。然后,我们将使用该信息来计算应分配给该活动的金额。

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

  • 15 分钟 --> $2.5
  • 30 分钟 --> 5 美元
  • 1小时 --> $10
  • 2:30 小时 --> $25

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

谢谢!

最好避免离散值的浮点。由于对您来说最小的有意义值是分钟,因此我建议将时间存储在其中。存储秒数提供了不必要的分辨率(更多数据),而存储小时数要么让您存储小数,要么意味着您没有足够的精度。

存储值的方式取决于您使用的 Rails 版本。如果是 5.1,则 Postgres 中对间隔列类型有本机支持。如果你有它,我会使用它,但如果你没有,它不是一个交易破坏者,只需使用整数列。

怎么样?

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

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

对于 Postgres,我会考虑使用间隔数据类型的想法,例如:

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)

最新更新