使用特定日期格式的键检索哈希值

时间:2017-05-10 16:47:00

标签: ruby-on-rails postgresql hstore

我正在使用Rails。我已经使用hstore在postgres数据库中按月存储了一个计数。

存储的哈希格式如下:

{" 2017-03-01 00:00:00 UTC" =>" 10"," 2017-04-01 00:00:00 UTC&# 34; =>" 3"}

由于密钥使用的日期格式,我很难找到从此哈希中检索特定月份计数的好方法。

问题

格式化字符串以匹配当前哈希键日期格式的最佳方法是什么?

  • 例如3月份在哈希中,关键是" 2017-03-01 00:00:00 UTC"

  • 但是,2017年3月1日的新DateTime格式为" 2017-03-01T00:00:00 + 00:00"

或者最好是首先更改我存储哈希的格式?

1 个答案:

答案 0 :(得分:0)

如果您需要特定格式的时间戳,则使用的标准工具是DateTime#strftime(所有时间类都将采用strftime方法,并且它们的行为都相同)。在你的情况下:

some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z')

将其挂钩到ActiveRecord:

Model.where('your_hstore -> :key', :key => some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z'))

或者:

Model.where('your_hstore -> ?', some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z'))

%Z应为“时区缩写名称”,对我而言,它会生成'UTC''PDT'等字符串,如果您的strftime(几乎可以肯定)只是系统的strftime的libc版本的包装器不会产生你想要的字符串然后你有一些选择:

  1. 如果时区始终为UTC,则完全删除时区。然后,密钥看起来像2017-03-01 00:00:00,您可以使用'%Y-%m-%d %H:%M:%S'作为strftime格式字符串。
  2. 如果他们的密钥实际上只是他们看起来的日期,那么请使用日期并删除时间。然后你的密钥看起来像2017-03-01,你在Ruby而不是Date中使用DateTime个实例,你会说some_date.strftime('%Y-%m-%d')some_date.iso8601 Ruby来获取你的hstore密钥。
  3. 如果您使用的是非UTC时区,请将所有内容转换为UTC并使用 1 2
  4. 如果您不想要上述任何一项,请切换到数字时区偏移(2017-05-10 18:05:57 +0000,2017-05-10 18:06:48 +00:00,.. 。)并使用%z格式字符串中的%:z%::zstrftime(请参阅这三者之间差异的文档)。
  5. 这些当然需要重新处理您在数据库中已有的任何数据,但最好是尽快完成。