PostgreSQL에서 UTC 현재 시간을 기본값으로 사용
-
PostgreSQL에서
UTC
시간을 얻는 표준 방법 -
UTC
형식의TIMESTAMP
열이 있는 테이블 생성 -
TIMEZONE()
을 사용하여 PostgreSQL의 테이블 열에 대한UTC
형식의TIME
가져오기 -
효율성 향상을 위해
UTC
시간 형식을 함수로 래핑
오늘 PostgreSQL에서는 UTC
현재 시간을 PostgreSQL의 테이블에서 기본 시간으로 사용하는 방법을 배웁니다. UTC
는 COORDINATED 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
을 사용하여 INSERTION
에 UTC
값을 포함하는 열을 지정할 수 있습니다. 이를 위해 다음과 같이 쿼리를 작성해 보겠습니다.
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 EXPRESSIONS
및 CONSTRAINTS
를 살펴보는 것이 중요합니다.
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
할 것입니다. 아래의 첫 번째는 이 TIMESTAMP
를 UTC
매개변수와 함께 제공되는 다른 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
그리고 두 번째 해결 방법인 CASTS
는 TEXT
로 표현한 다음 다른 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 설치 또는 버전에 따라 이를 수정해야 합니다.
그러나 각 쿼리와 해당 조건 및 제약 조건을 최대한 자세하게 다루기 위해 최선을 다하고 있습니다.
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