Unix 타임 스탬프 는 1970 년 1 월 1 일 자정 (UTC) 이후의 초 수입니다.
PostgreSQL에서 올바른 Unix 타임 스탬프를 얻으려면 어떻게해야하나요?
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 zone
는 timestamp
로 줄여 쓸 수 있습니다. 단순화를 위해 더 짧은 유형 이름을 사용하겠습니다.
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| */
하지만 다음과 같은 혼란스러운 동작에 유의하세요.
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| */
이 는 > :
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 두 번째는 결과에 새로운 시간대를 할당합니다.
SELECT FLOOR(EXTRACT(epoch FROM NOW())*1000);