programing

Postgre에서 시간대가 있거나 없는 타임스탬프 간의 차이SQL

yellowcard 2023. 5. 25. 21:39
반응형

Postgre에서 시간대가 있거나 없는 타임스탬프 간의 차이SQL

PostgrePostgre에서 다르게 저장됩니까? type이 SQL일WITH TIME ZONEWITHOUT TIME ZONE간단한 테스트 사례를 통해 차이점을 설명할 수 있습니까?

차이점은 Postgre에서 다룹니다.날짜/시간 유형에 대한 SQL 설명서입니다.네, 의 치료.TIME또는TIMESTAMP의 이에차있는가이사▁between▁one는있▁differsWITH TIME ZONE또는WITHOUT TIME ZONE값이 저장되는 방식에는 영향을 미치지 않으며 값이 해석되는 방식에도 영향을 미칩니다.

시간대가 이러한 데이터 유형에 미치는 영향은 특히 문서에서 다룹니다.그 차이는 시스템이 그 가치에 대해 합리적으로 알 수 있는 것에서 비롯됩니다.

  • 시간대를 값의 일부로 사용하면 값을 클라이언트에서 로컬 시간으로 렌더링할 수 있습니다.

  • 시간대를 값의 일부로 지정하지 않으면 명백한 기본 시간대는 UTC이므로 해당 시간대에 대해 렌더링됩니다.

동작은 최소 세 가지 요인에 따라 달라집니다.

  • 클라이언트의 표준 시간대 설정입니다.
  • 유형 데터유예형):WITH TIME ZONE또는WITHOUT TIME ZONE의 값입니다.의 값입니다.
  • 값이 특정 표준 시간대로 지정되었는지 여부를 나타냅니다.

다음은 이러한 요인의 조합을 다루는 예제입니다.

foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+09
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 06:00:00+09
(1 row)

foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+11
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 08:00:00+11
(1 row)

저는 그것을 언급된 Postgre보다 더 이해하기 쉽게 설명하려고 노력합니다.SQL 설명서.

둘 다 아니다.TIMESTAMP변형은 이름에 관계없이 시간대(또는 오프셋)를 저장합니다.차이점은 저장 형식 자체가 아니라 저장된 데이터(및 의도된 응용프로그램)의 해석에 있습니다.

  • TIMESTAMP WITHOUT TIME ZONE로컬 날짜 시간(벽력 달력 날짜 및 벽 시계 시간)을 저장합니다.Postgre까지 시간대가 지정되지 않았습니다.SQL은 알 수 있습니다(애플리케이션이 SQL이 무엇인지 알 수도 있음).그러므로, PostgreSQL은 입력 또는 출력 시 시간대 관련 변환을 수행하지 않습니다.값이 데이터베이스에 다음과 같이 입력된 경우'2011-07-01 06:30:30'나중에 표시하는 시간대에 상관없이 2011년, 07월, 01일, 06시간, 30분 및 30초(일부 형식)로 표시됩니다.Postgre 한입력지정한오프셋는간에 Postgre 의다무시됩니SQL이므로 SQL, 그래'2011-07-01 06:30:30+00'그리고.'2011-07-01 06:30:30+05' 와동함과 .'2011-07-01 06:30:30': 개의경: 다과유니다합과 합니다.java.time.LocalDateTime.

  • TIMESTAMP WITH TIME ZONEUTC 시간대에 점을 저장합니다.표시 방법(시간, 분 등)은 표준 시간대에 따라 다르지만 항상 동일한 "물리적" 순간(실제 물리적 이벤트의 순간)을 나타냅니다.입력은 내부적으로 UTC로 변환되며, 이렇게 저장됩니다.시간대가 때예: 이위해서는입오력알예하때입없명을시오간가대나이프셋인아시적므력야를에프로을셋의예▁for:▁zone때▁(▁the:'2011-07-01 06:30:30' Postgre의 으로 합니다. 합니다(SQL과 같이, 예그않, 렇지명으로지적사시용됩다니가시대(SQL과 같이).'2011-07-01 06:30:30+05'). )의 SQL 세션입니다.Java 개의경우:와유니다와 합니다.java.time.Instant 2에서는 ( JDBC와 JPA 2.2로 java.time.OffsetDateTime(또는 로)java.util.Date또는java.sql.Timestamp물론).

은 둘 다라고 말합니다.TIMESTAMP변형은 UTC 날짜-시간을 저장합니다.좀 그렇습니다만, 제 생각에는 그렇게 표현하는 것이 혼란스럽습니다. TIMESTAMP WITHOUT TIME ZONE처럼 됩니다.TIMESTAMP WITH TIME ZONE, 및 됩니다.그러나 UTC 해석에서 말하는 타임라인 상의 포인트를 나타내는 것은 아닙니다. ( UTC가 아니기 에, 없기 에, (실시간대가 UTC가 아니기 때문에 타임라인에 있는 점들의 집합입니다. 우리는 그것이 무엇인지 모릅니다.)

여기에 도움이 될 예가 있습니다.시간대가 있는 타임스탬프가 있는 경우 해당 타임스탬프를 다른 시간대로 변환할 수 있습니다.기본 표준 시간대가 없으면 올바르게 변환되지 않습니다.

SELECT now(),
   now()::timestamp,
   now() AT TIME ZONE 'CST',
   now()::timestamp AT TIME ZONE 'CST'

출력:

-[ RECORD 1 ]---------------------------
now      | 2018-09-15 17:01:36.399357+03
now      | 2018-09-15 17:01:36.399357
timezone | 2018-09-15 08:01:36.399357
timezone | 2018-09-16 02:01:36.399357+03

타임스탬프 z 대 타임스탬프

Postgres의 타임스탬프 필드는 기본적으로 입력 문자열에 주어진 타임스탬프에 시간대가 있더라도 실제로 Postgres가 "정상화된" UTC 시간을 저장하는 타임스탬프 필드입니다.

입력 문자열이 다음과 같은 경우: 2018-08-28T12:30:00+05:30, 이 타임스탬프가 데이터베이스에 저장되면 2018-08-28로 저장됩니다.T07:00:00.

단순 타임스탬프 필드에 비해 데이터베이스에 대한 입력은 시간대에 독립적이며, 다른 시간대의 앱이 타임스탬프를 삽입하거나 데이터베이스 서버 위치를 다른 시간대로 이동할 때 정확하지 않습니다.

문서에서 인용하기:

시간대가 있는 타임스탬프의 경우 내부에 저장된 값은 항상 UTC(Universal Coordinated Time, 전통적으로 그리니치 표준시, GMT)입니다.명시적 시간대가 지정된 입력 값은 해당 시간대에 적합한 오프셋을 사용하여 UTC로 변환됩니다.입력 문자열에 시간대가 지정되지 않은 경우 시스템의 TimeZone 파라미터에 의해 지정된 시간대에 있는 것으로 가정하고 시간대에 대한 오프셋을 사용하여 UTC로 변환됩니다.간단한 비유를 하자면, 타임스탬프츠 값은 시간의 순간을 나타내며, 보는 모든 사람에게 동일한 순간을 나타냅니다.그러나 타임스탬프 값은 시간대에 따라 다른 시간 인스턴스를 나타내는 시계의 특정 방향을 나타냅니다.

거의 모든 사용 사례에서 타임스탬프는 거의 항상 더 나은 선택입니다.타임스탬프와 타임스탬프 모두 동일한 8바이트의 데이터를 사용하기 때문에 이 선택이 더 쉬워집니다.

출처: https://hasura.io/blog/postgres-date-time-data-types-on-graphql-fd926e86ee87/

차이는 Postgre에 표시되어 있습니다.SQL 공식 문서입니다.심층 발굴은 문서를 참조하시기 바랍니다.

말해서 컨대요.TIMESTAMP WITHOUT TIME ZONE정보로 합니다.

예를들면

할 때 ㅠㅠㅠㅠ12:13, 11 June 2021 IST에서 SQL TIMESTAMP WITHOUT TIME ZONE를 거부하고 을 저장합니다.12:13,11 June 2021

하만그경는의 는.TIMESTAMP WITH TIME ZONE를 간대정저니다합에 합니다.UTC서식을 정하다

예를들면

할 때 ㅠㅠㅠㅠ12:13, 11 June 2021 IST에서 SQL TIMESTAMP WITH TIME ZONE은 이번에는 해변유수형으로 입니다.UTC됩니다.6:43,11 June 2021 UTC

NB : UTC + 5.30은 IST

에 의해 된 시간 TIMESTAMP WITH TIME ZONEUTC 형식으로 저장되며 IST 또는 PST 등과 같이 필요한 시간대로 변환할 수 있습니다.

그래서 Postgre의 추천 타임스탬프 유형은SQL은TIMESTAMP WITH TIME ZONE또는TIMESTAMPZ

다음을 실행하여 pgAdmin의 차이를 확인합니다.

create table public.testts (tz timestamp with time zone, tnz timestamp without time zone);
insert into public.testts values(now(), now());
select * from public.testts;

Angular / Typescript / Node API / PostgreSql 환경에서 타임스탬프 정밀도와 유사한 문제가 발생하면 저의 전체 답변과 솔루션이 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/5876218/difference-between-timestamps-with-without-time-zone-in-postgresql

반응형