2013-03-26 66 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

相关问题