2013-03-26 69 views
1

我試圖使用Postgres函數extract()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) 

回答

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 
+0

是的,這是工作 - 謝謝。 – Petriborg 2013-03-26 14:05:52

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

+0

這是我1969年回國,而不是1970年 - 我使用的是官方Postgres.org 9.2構建的Ubuntu 10.04。我編輯了我的問題以包含您的測試。 – Petriborg 2013-03-26 13:57:58

+0

@Petriborg需要一些更多的信息之外的「這不是工作」 – Woot4Moo 2013-03-26 13:59:28

相關問題