2017-10-07 50 views
0

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

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

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

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

谢谢!

回答

1

怎么办?

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

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

3

最好避免离散值的浮点。由于对你来说最小的有意义的值是分钟,所以我建议存储时间。存储秒提供了不必要的分辨率(更多数据),并且存储小时或者让你存储小数或者意味着你没有足够的精度。

您存储值的方式取决于您使用的Rails版本。如果是5.1,那么在Postgres中有interval column类型的本地支持。如果你有它,我会使用它,但如果你不这样做,它不是一个破坏者,只需使用一个整数列。

+2

一个优点是,可以将值传递到直并从[::的ActiveSupport持续时间](HTTP ://api.rubyonrails.org/v5.1/classes/ActiveSupport/Duration.html)。 – max

0

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

存储秒VS分钟的
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)