1

Postgres からのクエリ結果は次のとおりです。

$ psql ... -c 'select the_date from foo where foo_id in (998,999)'
     the_date      
------------------------
 2012-03-07 09:34:47.98
 2012-03-16 11:31:25.336

the_date は「タイムゾーンなしのタイムスタンプ」です。

以下は Ruby プログラムです。

#!/usr/bin/env ruby

require 'sequel'

@DB = Sequel.connect({...})
query = "select the_date from foo where foo_id in (998,999)"
@DB[query].each do |row|
  warn row
end

そしていくつかの出力:

{:the_date=>2012-03-07 09:34:47 -0600}
{:the_date=>2012-03-16 11:31:25 -0500}

-0500 と -0600 はどこから来たのですか? これは、サーバーとクライアント マシン (US/Central) の「オルソン タイムゾーン」ですが、Ruby はそれを追加し、psql は追加しないのはなぜですか?

ドキュメントを読んでいて、完全に混乱しています。

サーバーは Postgres 9.0.4、クライアントは psql 9.1.4、続編は 3.33.0 です。

4

2 に答える 2

2

列のタイプは「タイムゾーンなしのタイムスタンプ」です。したがって、Postgres がこの列に値を表示すると、タイムゾーンなしでタイムスタンプのみが表示されます。ただし、Sequel は Postgres タイムスタンプを Ruby Time クラスのインスタンスに変換する必要があり、Time クラスのインスタンスにはタイムゾーンを指定する必要があります (ローカル タイムゾーンの時刻または UTC の時刻のいずれか)。したがって、Sequel はいずれかを選択する必要があります。デフォルトでは、ローカル タイムゾーンが選択されます。

Sequel でデータベースとアプリケーションのタイムゾーンを設定できます。http://sequel.rubyforge.org/rdoc/classes/Sequel/Timezones.htmlを参照してください。

たとえば、私が手元に持っていたデータベースでの Sequel のデフォルトの動作は次のとおりです。

>   c['select * from actors'].each do |row|; puts row[:created_at]; end
Thu Jul 12 20:33:17 -0400 2012

ここで、タイムスタンプはローカル タイムゾーン (EDT) であると想定されています。

ただし、これを行うと:

> Sequel.database_timezone = :utc
 => :utc 
> c['select * from actors'].each do |row|; puts row[:created_at]; end
Thu Jul 12 20:33:17 UTC 2012

次に、タイムスタンプは UTC であると想定されます。

于 2012-08-02T02:30:22.820 に答える
0

ruby と日付/時刻/タイムスタンプに関して奇妙な扱いをしたことがあります。プログラムが結果を既知のデータ型に変換し、自動的にキャストしようとしているようです。これが、最後に 5 桁のタイムゾーン コードを受け取る理由です。

于 2012-08-01T23:12:23.203 に答える