PostgreSQL에서 현재 유닉스 타임 스탬프를 어떻게 얻습니까?

Unix 타임 스탬프 는 1970 년 1 월 1 일 자정 (UTC) 이후의 초 수입니다.

PostgreSQL에서 올바른 Unix 타임 스탬프를 얻으려면 어떻게해야하나요?

currenttimestamp.com

timestamp.1e5b.de PostgreSQL에서 예상 시간을 얻지 못했습니다.

올바른 타임 스탬프를 반환합니다.

SELECT extract(epoch from now()); 

그렇지 않지만 :

SELECT extract(epoch from now() at time zone "utc"); 

저는 UTC +02 시간대에 살고 있습니다. PostgreSQL에서 현재 Unix 타임 스탬프를 가져 오는 올바른 방법은 무엇입니까?

올바른 시간과 시간대를 반환합니다.

SELECT now(); now ------------------------------- 2011-05-18 10:34:10.820464+02 

다른 비교 :

select now(), extract(epoch from now()), extract(epoch from now() at time zone "utc"); now | date_part | date_part -------------------------------+------------------+------------------ 2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933 (1 row) Unix timestamp from the web sites: 1305707967 

답변

postgres에서 timestamp with time zone는 약어로 timestamptz로, timestamp without time zonetimestamp로 줄여 쓸 수 있습니다. 단순화를 위해 더 짧은 유형 이름을 사용하겠습니다.

now()와 같은 postgres timestamptz에서 Unix 타임 스탬프를 가져 오는 것은 간단히 말하면 다음과 같습니다.

select extract(epoch from now()); 

(now() 포함).

timestamp 필드가있을 때만 상황이 복잡해집니다. .

now()와 같은 timestamptz 데이터를 해당 필드에 입력하면 먼저 특정 시간대로 변환됩니다. (명시 적으로 at time zone를 사용하거나 세션 시간대로 변환) 및 시간대 정보는 삭제됩니다 . 더 이상 절대 시간을 참조하지 않습니다. 이것이 이유입니다. 일반적으로 타임 스탬프를 timestamp로 저장하지 않고 일반적으로 timestamptz를 사용합니다. 특정 영화가 오후 6시에 개봉 될 수 있습니다. 날짜 모든 시간대 , 이것이 일종의 사용 사례입니다.

단일 시간대에서만 작업하는 경우

. timestamptz로 다시 변환하는 것은 DST를 처리하기에 충분히 영리하며 변환을 위해 타임 스탬프는 현재 시간대에 있다고 가정합니다. 다음은 GMT / BST의 예입니다.

select "2011-03-27 00:59:00.0+00"::timestamptz::timestamp::timestamptz , "2011-03-27 01:00:00.0+00"::timestamptz::timestamp::timestamptz; /* |timestamptz |timestamptz | |:---------------------|:---------------------| |2011-03-27 00:59:00+00|2011-03-27 02:00:00+01| */ 

DBFiddle

하지만 다음과 같은 혼란스러운 동작에 유의하세요.

set timezone to 0; values(1, "1970-01-01 00:00:00+00"::timestamp::timestamptz) , (2, "1970-01-01 00:00:00+02"::timestamp::timestamptz); /* |column1|column2 | |------:|:---------------------| | 1|1970-01-01 00:00:00+00| | 2|1970-01-01 00:00:00+00| */ 

DBFiddle

는 > :

PostgreSQL은 유형을 결정하기 전에 리터럴 문자열의 내용을 검사하지 않으므로 […] 둘 다 시간대가없는 타임 스탬프로 처리합니다. 리터럴이 시간대가있는 타임 스탬프로 처리되는지 확인하고 올바른 명시 적 유형을 지정합니다. 시간대가없는 타임 스탬프로 확인 된 리터럴에서 PostgreSQL은 모든 시간대 표시를 자동으로 무시합니다.

댓글

답변

SELECT extract(epoch from now() at time zone "utc"); 

postgres 시간대 변환이 결과에서 시간대 정보를 버리기 때문에 올바른 타임 스탬프를 반환하지 않습니다.

9.9.3. AT TIME ZONE

구문 : 시간대가없는 타임 스탬프 AT TIME ZONE 영역
반환 값 : 시간대가있는 타임 스탬프
지정된 타임 스탬프를 시간대없이 지정된 시간대에있는 것으로 처리

구문 : 시간대가있는 타임 스탬프 AT TIME ZONE zone
반환 : 시간대가없는 타임 스탬프
시간대가 지정된 지정된 타임 스탬프를 시간대 지정없이 새 시간대로 변환

이후 extract는 시간대가없는 타임 스탬프를보고 현지 시간으로 간주합니다 (실제로는 이미 utc 임에도 불구하고).

올바른 방법 다음과 같습니다.

select now(), extract(epoch from now()), -- correct extract(epoch from now() at time zone "utc"), -- incorrect extract(epoch from now() at time zone "utc" at time zone "utc"); -- correct now | date_part | date_part | date_part -------------------------------+------------------+------------------+------------------ 2014-10-14 10:19:23.726908+02 | 1413274763.72691 | 1413267563.72691 | 1413274763.72691 (1 row) 

마지막 줄에서 첫 번째 at time zone가 변환을 수행하고 seco 두 번째는 결과에 새로운 시간대를 할당합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다