[postgresql] PostgreSQL에서 UTC로 현재 시간을 기본값으로 사용

TIMESTAMP WITHOUT TIME ZONE유형 의 열이 있으며 기본값을 UTC로 현재 시간으로 설정하고 싶습니다. UTC로 현재 시간을 얻는 것은 쉽습니다.

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

열에 현재 타임 스탬프를 사용하는 경우

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...



답변

기능도 필요하지 않습니다. 기본 표현식 주위에 괄호를 넣으십시오.

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


답변

또 다른 해결책 :

timezone('utc', now())


답변

함수로 감싸십시오.

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()
);


답변

이건 어떤가요

now()::timestamp

다른 타임 스탬프에 시간대가없는 경우이 캐스트는 현재 시간에 대해 “타임 스탬프가없는 타임 스탬프”와 일치하는 유형을 생성합니다.

그래도 다른 사람들이 그 옵션에 대해 어떻게 생각하는지 읽고 싶습니다. 나는 여전히 “있는 /없는”시간대에 대한 나의 이해를 신뢰하지 않습니다.

편집 : 중요한 점을 분명히하기 때문에 Michael Ekoka의 의견을 여기에 추가하십시오.

경고. 문제는 시간대를 저장하지 않는 타임 스탬프 열에 대해 UTC로 기본 타임 스탬프를 생성하는 것입니다 (아마도 모든 타임 스탬프가 동일한 것을 공유하는 경우 시간대를 저장할 필요가 없기 때문에). 솔루션은 로컬 타임 스탬프 (대부분의 사람들은 반드시 UTC로 설정하지 않아도 됨)를 생성하고 순진 타임 스탬프 (표준 시간대를 지정하지 않은 타임 스탬프)로 저장하는 것입니다.


답변

다음과 같은 두 가지 솔루션이 있습니다.

(다음 코드에서, 당신은 대체해야 'UTC'에 대한 구역now()대한 타임 스탬프 )

  1. timestamp AT TIME ZONE zone -SQL 표준 준수
  2. timezone(zone, timestamp) -더 읽기 쉽다

timezone (zone, timestamp) 함수는 TIME ZONE 존의 SQL 준수 구문 타임 스탬프와 같습니다.


설명:

  • zone 은 텍스트 문자열 (예 🙂 'UTC'또는 간격 (예 :)으로 지정할 수 있습니다. INTERVAL '-08:00'여기에 사용 가능한 모든 시간대 목록이 있습니다.
  • 타임 스탬프 형식의 모든 값이 될 수있는 타임 스탬프
  • now()데이터베이스의 기본 시간대 (예 :)가 첨부 된 타임 스탬프 유형 (필요한 것) 의 값을 반환합니다 2018-11-11T12:07:22.3+05:00.
  • timezone('UTC', now())현재 시간대 ( 타임 스탬프가있는 타임 스탬프 유형 )를에있는 시간대없는 시간 으로 바꿉니다 UTC.
    예를 들어을 SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'반환 2020-03-16T20:00:00Z합니다.

문서 : timezone ()


답변

함수가 이미 존재합니다 : timezone ( ‘UTC’:: text, now ())


답변