【问题标题】:Parse Postgres date stored as string including offset timezone解析存储为字符串的 Postgres 日期,包括偏移时区
【发布时间】:2016-10-30 17:10:03
【问题描述】:

我有一些日期作为字符串存储在 postgresdb 中

"Fri, 24 Jun 2016 04:13:26 -0700"

我想将这些日期视为日期。

我可以使用

to_timestamp(date,'Dy, DD Mon YYYY HH24:MI:SS')

但我不知道如何处理时区。似乎有 OF 作为偏移量的参数。

如果我使用

to_timestamp(date, 'Dy, DD Mon YYYY HH24:MI:SS OF')

查询挂起。我无法弄清楚我在那里做错了什么。

注意:我正在使用 activerecord 和 rails。所以查询实际上是

Model.all.order("to_timestamp(date,'Dy, DD Mon YYYY HH24:MI:SS OF') DESC")

【问题讨论】:

  • 也许吧? Time.zone.parse("Fri, 24 Jun 2016 04:13:26 -0700").to_date。只是一个猜测。签出:api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
  • PostgreSQL 足够聪明:select timestamp with time zone 'Fri, 24 Jun 2016 04:13:26 -0700'; 为我的位置返回 2016-06-24 14:13:26+03
  • @Abelisto 有没有办法用 to_timestamp 方法做到这一点?问题是我试图用订单而不是选择来做。
  • 这只是一个例子。在你的情况下,它可能是Model.all.order("date::timestamptz DESC")
  • @Abelisto 你想把这个答案放在下面吗?这是绝对正确的。我到处搜索如何做到这一点。从文档中真的不清楚。

标签: ruby-on-rails postgresql activerecord timezone timezone-offset


【解决方案1】:

你可以试试这个方法

“2016 年 6 月 24 日星期五 04:13:26 -0700”.to_datetime

希望对您有所帮助。

【讨论】:

  • 当然,我可以这样做,但只有在我恢复查询后才能这样做。即,我希望我可以纯粹用 activerecord 做一些事情。
  • 您的意思是说,您需要按查询顺序排列该日期值?
  • 这正是我想要做的。
  • 您可以通过查询而不是该字段的值来按顺序使用字段名称。
【解决方案2】:

PostgreSQL 支持多种日期/时间/时间戳值输入格式。 See the reference.

您的格式也受支持,因此可以使用简单类型转换。 PostgreSQL 中有三种方式和两种类型表示法:

timestamp with time zone 或更短的timestamptz

然后键入:

cast('Fri, 24 Jun 2016 04:13:26 -0700' as timestamp with time zone)
timestamp with time zone 'Fri, 24 Jun 2016 04:13:26 -0700'
'Fri, 24 Jun 2016 04:13:26 -0700'::timestamptz

这是相等的。您可以根据自己的喜好使用任何组合。

所以回答你的问题:

Model.all.order("date::timestamptz DESC")

应该成功了。

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 2020-04-22
    • 2015-02-02
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多