我正在构建一个rails应用程序,用户从日期选择器中获取日期,从时间选择器中获取时间。使用时刻js格式化日期和时间以按以下方式显示日期和时间:
moment().format('LL'); //January 23,2017
moment().format('LTS'); //1:17:54 PM
我阅读了这个答案,并附有关于选择合适的色谱柱类型的指南。 Is there documentation for the Rails column types?
理想情况下,我应该使用:date,:time或:timestamp。但由于格式化了日期,我应该使用:string而不是吗?
在这种情况下使用哪种正确且合适的列类型?
答案 0 :(得分:1)
您可以在数据库中有一个timestamp列,然后将请求解析为ruby datetime对象,如下所示:
d = Time.parse(params[:date])
t = Time.new(params[:time])
dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec, t.zone)
#now simply use dt to your datetime column
在Postgres上,您可以将ruby DateTime对象直接保存到postgres 时间戳字段,例如
User.first.update_attribute('updated_at', dt )
另一个选择是将你的日期和时间字符串连接成一个,然后你可以做一个单行:
User.last.update_attribute('created_at', Time.parse('January 23,2017 1:17:54 PM'))
我很确定这也适用于MySQL日期时间或时间戳。
归功于大卫·格雷森Ruby: combine Date and Time objects into a DateTime
答案 1 :(得分:1)
如果要在数据库中存储时间参考,则应使用数据库为您提供的类型之一。我将使用MySQL(这是我最常用的那个)解释这个,但其他数据库服务器的解释应该类似。
如果你使用timestamp
列,你将只使用4个字节的存储空间,这总是一个好新的,因为它制作较小的索引,在内部数据库操作期间使用较少的内存表中的内存和等等。但是,timestamp
的范围小于datetime
,因此您只能存储从1970年到2038年的值或多或少
如果您使用datetime
,您将能够以相同的精度(秒)存储更广泛的范围(从1001年到9999年)。不好的结果是更高的范围需要更多的内存,使其稍慢。
这两种列类型之间存在一些不适合这个答案的差异,但在决定之前应该留意。
如果你使用varchar
这是Ruby on Rails中文本属性的默认列类型,那么每次你需要使用它时,你将被迫从文本转换为日期时间,反之亦然。领域。此外,对该列进行排序或过滤效率非常低,因为数据库需要在过滤或排序之前将所有字符串转换为日期,从而无法在该列上使用索引。
如果您需要亚秒精度,您可以使用bigint
来满足您的要求,因为MySQL没有为此目的提供特定日期类型
一般情况下,如果您的申请要求符合timestamp
限制,我建议您使用timestamp
。否则,请使用datetime
,但我强烈建议您不要将varchar
用于此目的。
编辑:格式化
在数据库中存储日期的方式与向用户显示日期的方式完全不同。您可以使用DateTime
创建DateTime.new(year, month, day, hour, minute, second)
对象,并将该对象分配给模型。当您将其保存到数据库中时,ActiveRecord将负责将DateTime对象转换为适当的数据库格式。
为了以特定格式(在视图,API响应等中)显示已存储在数据库中的值,您可以查看其他帖子,例如this one。