PostgreSQL에서 타임 스탬프를 가장 잘 저장하는 방법은 무엇입니까?


20

PostgreSQL DB 디자인을 작업 중이며 타임 스탬프를 저장하는 가장 좋은 방법이 궁금합니다.

가정

다른 시간대의 사용자는 모든 CRUD 기능에 데이터베이스를 사용합니다.

나는 두 가지 옵션을 보았다.

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

들어 timestamp나는 INSERT 순간에 대한 정확한 (UTC) 타임 스탬프를 대표 할 문자열을 보낼 것이다.

들어 bigint나는 정확히 같은 일을 저장하지만, 숫자 형식 것이다. (밀리 초가 서버로 전달되기 전에 시간대 문제가 처리되므로 항상 UTC로 표시됩니다.)

를 저장하는 하나의 주요 장점은 bigint저장하는 간단한 번호 (유닉스 에폭 밀리 초)보다 더 복잡 올바른 형식의 타임 스탬프를 통과으로 검색 할 쉬울 것이라고 할 수있다.

내 질문은 어느 것이 가장 유연한 디자인을 허용하고 각 접근법의 함정이 될 수 있는지에 대한 것입니다.


타임 스탬프가 타임 스탬프를 나타내는 데 bigint보다 나은 이유는 여러 가지가 있습니다. bigint가 타임 스탬프보다 나은 단일 이유는 생각할 수 없습니다.
Lennart

BigInt가 더 쉬울 수 있다고 생각하는 주된 이유는 검색 및 저장이 훨씬 쉬울 수 있기 때문입니다. 질문을 업데이트하겠습니다.
Bam

답변:


23

로 스토어는 타임 스탬프 timestamp, 또는 오히려 timestamptz( timestamp with time zone당신이 처리되기 때문에) 여러 시간대 . 유효한 데이터를 적용하며 일반적으로 가장 효율적입니다. 데이터 유형을 이해해야합니다.

우려 사항을 해결하려면 :

올바른 형식의 타임 스탬프를 전달하는 것은 단순한 숫자보다 더 복잡합니다

원하는 경우 UNIX epoch를 전달하고 검색 할 수 있습니다.

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

관련 :

DB에 쓰는 현재 타임 스탬프 를 저장하려면 timestamptz 기본값이now() 있는 열을 사용하십시오 . DB 서버의 시스템 시간은 일반적으로 여러 클라이언트가 시간을 나타내는 각각의 개념을 전달하는 것보다 훨씬 안정적이며 일관성이 있습니다.
다음 INSERT과 같이 간단 할 수 있습니다.

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

그리고 그 열에 쓰지 마십시오. 자동으로 채워집니다.


이것은 일을 분명히했다. 타임 스탬프가 8 바이트 정수로 저장된다는 사실 외에, "to_timestamp"함수를 사용하여 bigint, 저장 및 검색과 같은 필수 요소는 훨씬 간단한 선택입니다. 감사합니다
Bam

8

내장 함수를 사용할 수 있도록 항상 데이터를 기본 데이터 유형으로 저장해야합니다. 타임 스탬프의 데이터 유형은 분명히timestamp .

BTW, A는 timestamp되어 있지 문자열로 저장, 그것은 정확히 같은, 8 바이트 정수로 저장된 bigint: PostgreSQL의 문서 .


사과드립니다 . 타임 스탬프를 저장하지 않고 저장을 위해 문자열보내 겠다고 말하고 싶습니다 . 수정했습니다.
Bam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.