2016-09-27 6 views
1

나는 시간대가없는 타임 스탬프가 PostgreSQL SQL 함수에 삽입되는 것을 막고 싶습니다.PostgreSQL : 타임 스탬프에 타임 존이 있는지 테스트하는 방법은 무엇입니까?

hostname:~ username$ date 
Tue Sep 27 15:30:16 CEST 2016 

hostname:~ username$ uname -a 
Darwin hostname.domain 14.5.0 Darwin Kernel Version 14.5.0: Mon Aug 29 21:14:16 PDT 2016; root:xnu-2782.50.6~1/RELEASE_X86_64 x86_64 

hostname:~ username$ psql -U postgres 
psql (9.5.3) 
Type "help" for help. 

postgres=# SELECT extract(TIMEZONE FROM '2016-09-19 01:00:00'::timestamptz); 
date_part 
----------- 
     7200 
(1 row) 

postgres=# SELECT extract(TIMEZONE FROM '2016-09-19 01:00:00+0200'::timestamptz); 
date_part 
----------- 
     7200 
(1 row) 

postgres=# SELECT extract(TIMEZONE FROM '2016-09-19 01:00:00+0800'::timestamptz); 
date_part 
----------- 
     7200 
(1 row) 

내가 일반적으로 뭔가를 오해하고있어 느낌이 : 유일한 방법은 내가 포스트 그레스 그냥 서버에서 시간대를 사용하는 대신 어떤 시간대 문자열 접미사를 무시하는 것하고 있기 때문에 작동하지 않습니다와 함께 올 수 있었다. 누구든지 도와 줄 수 있습니까?

업데이트 20,160,928는 :이 (손에있는 질문에 대한 필수적인 무엇을 벗었) 내 데이터베이스 일부 설명 컨텍스트를 제공하기 위해

입니다 :

CREATE DATABASE my_db; 
CREATE TABLE my_table 
(
    id serial PRIMARY KEY, 
    timestamp_utc timestamp with time zone NOT NULL, 
    title text NOT NULL 
); 

이 내입니다 함수는 현재의 형태로 데이터를 삽입 : I가 SQLFiddle를 작성한

CREATE FUNCTION insert_row 
(
    p_timestamp_utc timestamp with time zone, 
    p_title   text 
) 
RETURNS integer 
LANGUAGE SQL 
SECURITY DEFINER 
VOLATILE 
AS 
$BODY$ 
    INSERT INTO my_table 
       ( timestamp_utc title) 
     VALUES (p_timestamp_utc, p_title) 
     RETURNING id; 
$BODY$; 

; 하지만 실패가 유지 기능을 ... 만드는

문제점 : 타임 스탬프 매개 변수가 시간대 수행하지 않는 경우에도

함수를 호출 성공 :

SELECT insert_row('2016-09-01 01:00:00'::timestamptz, 'some title'); 

을 내가 찾을 필요 이 함수 호출을 실패하게 만드는 방법.

이유가 내가이 작업을 실패하게 만들려면 타임 스탬프가 코드에 의해 적용될 시간대를 정의해야합니다. 대안은 데이터베이스 서버와 클라이언트가 어떻게 든 암묵적으로 또는 협상에 동의한다는 것입니다. 그리고 그것은 저에게 똑똑한 움직임처럼 들리지는 않습니다. ...

답변

1

PostgreSQL에서는 시간대 정보가 timestamp with time zone과 함께 저장되지 않습니다. . 타임 스탬프는 내부 ​​표현으로 변환 될 때 UTC으로 변환됩니다.

timestamp with time zone이 문자열 (예 :. 표시되면 TimeZone 구성 매개 변수에 설정된 시간대로 변환됩니다.

EXTRACT을 사용하여 시간대 정보를 검색 할 때도 마찬가지입니다. 설명서는 그것에 대해 약간 명확하지 않습니다. 시간대가 다음과 같이 설정되어있는 경우

그래서 :

test=> SHOW TimeZone; 
    TimeZone 
--------------- 
Europe/Vienna 
(1 row) 

당신은 얻을 것이다 :

중앙 유럽 시간이 UTC에서 1 시간 상쇄되기 때문에
test=> SELECT extract(TIMEZONE FROM '2016-01-01 00:00:00-07'::timestamptz); 
date_part 
----------- 
     3600 
(1 row) 

test=> SELECT extract(TIMEZONE FROM '2016-08-01 00:00:00-07'::timestamptz); 
date_part 
----------- 
     7200 
(1 row) 

중부 유럽 서머 타임이 UTC에서 2 시간 오프셋되어 있기 때문에

+0

정보 주셔서 감사합니다!:-) 귀하의 답변은 확실히 유익한 동안, 그것은 정말로 내 타임 스탬프가없는 타임 스탬프가 내 데이터베이스에 삽입되는 것을 방지하는 나의 문제에 도움이되지 않습니까? – ssc

+0

나는 당신의 "일반적인 오해"를 해결하려고 노력했다. 문제 해결에 도움이되도록 PostgreSQL의'SQL' 함수 *에 삽입 된 것이 무엇을 의미하는지 설명 할 수 있습니까? –

관련 문제