如何从created_at列中仅提取年份

Asa*_*uhi 1 postgresql datetime ruby-on-rails

查询数据库中的created_at值会得到以下输出:

>> kevin.created_at
=> Sun, 21 Aug 2016 07:46:26 UTC +00:00
Run Code Online (Sandbox Code Playgroud)

如何从这些信息中仅提取年份?
我试着把它kevin.created_at视为一个字符串,看看我能不能得到我想要的东西:

>> kevin.created_at.split[3].to_i
Run Code Online (Sandbox Code Playgroud)

但是我收到这条消息:

NoMethodError: undefined method `split' for Sun, 21 Aug 2016 07:46:26 UTC +00:00:Time
Run Code Online (Sandbox Code Playgroud)

所以我试过:

>> kevin.created_at.to_a
=> [26, 46, 7, 21, 8, 2016, 0, 234, false, "UTC"]
Run Code Online (Sandbox Code Playgroud)

所以我可能有一个解决方案:

>> kevin.created_at.to_a[5]
=> 2016
Run Code Online (Sandbox Code Playgroud)

有没有更好或更优雅的解决方案来查询Postgresql获取此信息?

小智 14

您可以使用ruby Time类中的.year函数:

kevin.created_at.year
Run Code Online (Sandbox Code Playgroud)


Rob*_*bel 5

在Postgres中,该EXTRACT功能可以为您提供从日期开始的年份:

# SELECT EXTRACT('year' FROM created_at) as year FROM USERS LIMIT 1;
 year
------
 2016
(1 row)
Run Code Online (Sandbox Code Playgroud)

在Ruby中,如果您已经掌握了记录,则可以使用以下Time#year方法:

user.created_at.year  # => 2016
Run Code Online (Sandbox Code Playgroud)