2013-05-17 2 views
87

저는 TIMESTAMP WITHOUT TIME ZONE 유형의 열을 가지고 있으며 그 기본값을 현재 시간 (UTC)으로하고 싶습니다. 컬럼의 현재 타임 스탬프 사용PostgreSQL의 기본값으로 UTC의 현재 시간을 사용합니다

postgres=# select now() at time zone 'utc'; 
      timezone   
---------------------------- 
2013-05-17 12:52:51.337466 
(1 row) 

으로 : UTC의 현재 시간을 얻는 것은 쉬운

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp); 
CREATE TABLE 
postgres=# insert into test values (1) returning ts; 
      ts    
---------------------------- 
2013-05-17 14:54:33.072725 
(1 row) 

을하지만 로컬 시간을 사용합니다. 구문 오류 UTC 결과에 그것을 강제로 시도 :

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc'); 
ERROR: syntax error at or near "at" 
LINE 1: ...int, ts timestamp without time zone default now() at time zo... 

답변

178

함수 것은도 필요하지 않습니다. 다음이 캐스트가 현재 시간에 대한 일치하는 유형 "시간대가없는 타임 스탬프를"얻을 것입니다 시간대 않고 다른 타임 스탬프가있는 경우

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc') 
); 
+0

는) 정말 빛나는 – misaxi

+0

시간이 다시 시간을가는 경우에도 작동 - 지금()을 알고있는 타임 스탬프를 반환 UTC에서 오프셋. –

14

함수에 랩 :

create function now_utc() returns timestamp as $$ 
    select now() at time zone 'utc'; 
$$ language sql; 

create temporary table test(
    id int, 
    ts timestamp without time zone default now_utc() 
); 
11

무엇

now()::timestamp 

에 대한 : 그냥 기본 표현 괄호를 넣어 .

다른 사람들이 그 옵션에 대해 생각하는 것을 읽고 싶습니다. 나는 아직도이 "시간제 (time zone)"/ "없음"에 대한 나의 이해를 믿지 않는다.

+0

재미있는 속임수이지만이 행동을 알고 있지 않으면 혼란을 겪을 수 있습니다. 허용 된 대답은 원하는 행동과 결과에 대해 명확합니다. 함수와 동일하지만 DB에서 함수를 사용하지 않습니다 .... –

2

또 다른 솔루션 : 쿼리를 작성할 때 내가 now_utc 같은 funciton를 (볼 수 있습니다

timezone('utc', now()) 
관련 문제