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

Bilal Shahid 2023년6월20일
  1. PostgreSQL에서 UTC 시간을 얻는 표준 방법
  2. UTC 형식의 TIMESTAMP 열이 있는 테이블 생성
  3. TIMEZONE()을 사용하여 PostgreSQL의 테이블 열에 대한 UTC 형식의 TIME 가져오기
  4. 효율성 향상을 위해 UTC 시간 형식을 함수로 래핑
PostgreSQL에서 UTC 현재 시간을 기본값으로 사용

오늘 PostgreSQL에서는 UTC 현재 시간을 PostgreSQL의 테이블에서 기본 시간으로 사용하는 방법을 배웁니다. UTCCOORDINATED UNIVERSAL TIME을 의미합니다.

전 세계적으로 시계와 시간을 조절하는 UNIVERSAL 방식입니다. 현지 시간대는 특정 위치에만 시간이 지정되어 있으며 대부분 서민을 더 잘 이해하기 위해 사용됩니다.

PostgreSQL 서버에서 UTC로 현재 시간을 설정하는 다양한 솔루션을 살펴볼 것입니다.

PostgreSQL에서 UTC 시간을 얻는 표준 방법

현재 PostgreSQL 세션에 대해 UTC 형식으로 시간을 얻기 위해 간단한 쿼리를 호출할 수 있습니다.

select now() at time zone ('utc');

그러면 다음과 같은 테이블이 반환됩니다.

출력:

timezone (timestamp without timezone)
"2022-04-27 16:38:29.354155"

어떻게 작동합니까? 먼저 NOW()를 호출하여 현재 트랜잭션의 시작 시간을 가져옵니다.

이는 UTC 형식으로 정의된 TIME ZONE에서 가져옵니다. 따라서 이 간단한 쿼리는 필요한 영역에서 현재 시간을 얻는 데 도움이 됩니다.

TIMEZONE 절을 정의하지 않고 이 쿼리를 호출하는 경우 세션이 다음과 같이 GMT 지정된 시간 값을 반환한다는 것을 알 수 있습니다.

select now();

출력:

timezone (timestamp with timezone)
2022-04-27 21:55:14.098115+05

따라서 TIME 값을 가져올 때 UTC를 지정하는 것이 필수적입니다. 대부분의 경우 TIMESTAMP를 사용하는 동안 시스템 TIME 값은 UTC에 저장되며 그렇지 않으면 다르게 지정됩니다.

또한 로컬에서 UTC 날짜로 또는 그 반대로 암시적 변환이 있을 수 있습니다.

UTC 형식의 TIMESTAMP 열이 있는 테이블 생성

레코드 정보에 유효한 시간이 포함되어야 하는 테이블에 INSERTING 데이터를 저장하는 일반적인 방법은 업데이트된 현재 DATE TIME으로 구성되는 열인 자동 시간 처리기를 추가하고 레코드가 INSERTED가 되면 저장하는 것입니다. .

UTC의 별칭인 TIMESTAMP WITHOUT TIME ZONE을 사용하여 INSERTIONUTC 값을 포함하는 열을 지정할 수 있습니다. 이를 위해 다음과 같이 쿼리를 작성해 보겠습니다.

create temporary table DELFTSTACK_TUT(time_stamp timestamp without time zone default (now() at time zone('utc')), rec int);

위 쿼리를 실행하면 DEFAULT TIMESTAMP 열이 포함된 임시 테이블이 생성됩니다. 위의 테이블에서 INSERT를 호출하면 삽입된 모든 레코드에는 UTC로 생성되고 추가되는 자동 TIMESTAMP가 포함됩니다.

다음과 같이 쿼리를 실행합니다.

insert into DELFTSTACK_TUT (rec) VALUES(1), (2), (3);

출력에서 다음과 같이 테이블을 반환합니다.

timestamp without time zone    rec
"2022-04-27 17:13:31.159356"	1
"2022-04-27 17:13:31.159356"	2
"2022-04-27 17:13:31.159356"	3

따라서 DEFAULT 절에서 UTC와 함께 NOW() 식을 사용하면 레코드 유지가 필요한 테이블을 만드는 데 완벽하게 작동한다는 것을 알 수 있습니다.

DEFAULT 절 주위의 대괄호를 놓치지 않도록 하십시오. 전체 표현식을 단일 항목으로 받아들인 다음 해당 레코드의 값을 채우는 데 사용해야 하기 때문입니다.

다른 버전의 PostgreSQL에서 다른 문제가 발생할 수 있습니다. 때때로 TIME ZONE을 정의하는 오류가 있을 수 있습니다.

UTC 대신 UTC를 쓰면 다른 CASE로 인해 문제가 발생할 수 있습니다. 따라서 PostgreSQL에서 이러한 표현식을 작성하는 동안 CASE SENSITIVE EXPRESSIONSCONSTRAINTS를 살펴보는 것이 중요합니다.

TIMEZONE()을 사용하여 PostgreSQL의 테이블 열에 대한 UTC 형식의 TIME 가져오기

열에 대한 UTC 형식의 TIME DATE 값을 가져오는 또 다른 간단한 대안은 쿼리를 호출하는 것입니다.

create temporary table DELFTSTACK_TUT(time_stamp timestamp without time zone default ('utc', now()), rec int);

그러나 이것은 CREATING시 다음과 같은 오류를 반환합니다.

출력:

ERROR:  column "time_stamp" is of type timestamp without time zone but default expression is of type record
HINT:  You will need to rewrite or cast the expression.
SQL state: 42804

유형의 불일치로 인해 오류가 발생합니다. CAST 또는 위의 식을 다시 작성하여 이 오류를 제거할 수 있습니다.

그러나 더 잘 이해할 수 있도록 두 가지 방법으로 쿼리를 CAST할 것입니다. 아래의 첫 번째는 이 TIMESTAMPUTC 매개변수와 함께 제공되는 다른 TIMEZONE으로 변환합니다.

create temporary table DELFTSTACK_TUT(time_stamp timestamp without time zone default timezone('utc', now()), rec int);

그러면 다음과 같은 표가 제공됩니다.

출력:

timestamp without time zone    rec
"2022-04-27 17:45:34.257072"	1
"2022-04-27 17:45:34.257072"	2
"2022-04-27 17:45:34.257072"	3

그리고 두 번째 해결 방법인 CASTSTEXT로 표현한 다음 다른 PostgreSQL 버전 간에 변형이 있을 수 있는 경우 출력을 가져옵니다.

create temporary table DELFTSTACK_TUT(time_stamp  timestamp without time zone default now()::timestamp, rec int);

위와 INSERTING 3 레코드를 테이블에 실행하면 다음과 같은 출력이 제공됩니다.

timestamp without time zone    rec
"2022-04-27 22:49:51.654846"	1
"2022-04-27 22:49:51.654846"	2
"2022-04-27 22:49:51.654846"	3

따라서 NOW()TIMESTAMP로 캐스팅한 다음 UTC 지정 열에 삽입하면 올바른 결과를 얻을 수 있음을 알 수 있습니다. 그러나 후자의 솔루션은 UTC 오프셋을 고려하지 않고 순진한 타임스탬프만 기록으로 유지합니다.

UTC 대신 INTERVAL -8:00 사용

세션에서 UTC를 쓰는 CASE 문제에 얽매이지 않으려면 다음과 같이 쿼리를 작성할 수 있습니다.

create temporary table DELFTSTACK_TUT(time_stamp timestamp without time zone default timezone(INTERVAL '+00:00', now()), rec int);

이 쿼리를 실행하고 테이블을 만들고 INSERT를 호출하면 UTC 형식으로 올바른 결과가 반환됩니다. INTERVAL with +00:00은 PostgreSQL 설명서에서 UTC 또는 ZULU (Military Abbreviation) 시간대에 오프셋이 +00.00인 것으로 정의됩니다.

결과는 다음과 같이 생성됩니다.

 timestamp without time zone   rec
"2022-04-27 17:57:36.054746"	1
"2022-04-27 17:57:36.054746"	2
"2022-04-27 17:57:36.054746"	3

효율성 향상을 위해 UTC 시간 형식을 함수로 래핑

UTC로 현재 시간을 가져오는 간단한 함수를 만든 다음 INSERTIONS 레코드와 함께 사용할 수 있습니다.

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

그런 다음 SELECT 쿼리를 호출하여 다음과 같이 현재 시간을 가져옵니다.

select * from get_UTC_time();

그러면 다음 결과가 출력됩니다.

timestamp without time zone
"2022-04-27 18:01:35.42119"

또한 테이블 내에서 다음과 같이 사용할 수 있습니다.

create temporary table DELFTSTACK_TUT(time_stamp  timestamp without time zone default get_UTC_time());

따라서 PostgreSQL 세션에 대해 UTC 형식으로 시간을 가져오는 다양한 방법을 살펴보았습니다. PostgreSQL 설치 또는 버전에 따라 이를 수정해야 합니다.

그러나 각 쿼리와 해당 조건 및 제약 조건을 최대한 자세하게 다루기 위해 최선을 다하고 있습니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub