2

extract()Postgres関数を使用して列から年を取得しようとしてtimestamptzいますが、予期しない結果が得られます。UTCを使用することを期待していましたが、システムのローカルタイムゾーン(私の場合はEST)が何であれ使用しているようです。extractタイムスタンプまたはシステムのタイムゾーンに関係なく、関数がUTCを返すようにするにはどうすればよいですか?

例1:

testdb=# create table foo ( t timestamptz check( extract(year from t)::int = 2013) );

testdb=# \d foo
              Table "public.foo"
 Column |           Type           | Modifiers
--------+--------------------------+-----------
 t      | timestamp with time zone |
Check constraints:
    "foo_t_check" CHECK (date_part('year'::text, t)::integer = 2013)

testdb=# insert into foo values ('2013-01-01 01:49:05.048+00');
ERROR:  new row for relation "foo" violates check constraint "foo_t_check"
DETAIL:  Failing row contains (2012-12-31 20:49:05.048-05).

例2:

testdb=# SELECT EXTRACT(year FROM '01-01-1970 00:00:00 UTC+01'::timestamp with time zone);
 date_part
-----------
      1969
(1 row)
4

2 に答える 2

2

使用するat time zone

create table foo (
    t timestamptz
    check (extract(year from t at time zone 'UTC') = 2013)
);

select extract(year from
    '01-01-1970 00:00:00 utc+01'::timestamp with time zone at time zone 'utc'
    );
 date_part 
-----------
      1970
于 2013-03-26T14:03:54.087 に答える
0

私はこのようなものを信じています:

extract(year from t::timestamp with time zone)

実例:

SELECT EXTRACT(year FROM 
               '01-01-1970 00:00:00 UTC+01'::timestamp 
               with time zone)

戻り値1970

于 2013-03-26T13:49:39.217 に答える