programing

Postgre에서 UTC의 현재 시간을 기본값으로 사용SQL

bestprogram 2023. 5. 12. 22:46

Postgre에서 UTC의 현재 시간을 기본값으로 사용SQL

나는 의 칼럼을 가지고 있습니다.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 zoneSQL 표준 준수
  2. timezone(zone, timestamp)틀림없이 더 읽기 쉬운.

함수 시간대(존, 타임스탬프)는 SQL 준수 구성 타임스탬프 AT TIME 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.

문서: 표준 시간대()

함수가 이미 있습니다. 시간대(')UTC'::text, now()

언급URL : https://stackoverflow.com/questions/16609724/using-current-time-in-utc-as-default-value-in-postgresql