나는 시간대가없는 타임 스탬프가 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');
을 내가 찾을 필요 이 함수 호출을 실패하게 만드는 방법.
이유가 내가이 작업을 실패하게 만들려면 타임 스탬프가 코드에 의해 적용될 시간대를 정의해야합니다. 대안은 데이터베이스 서버와 클라이언트가 어떻게 든 암묵적으로 또는 협상에 동의한다는 것입니다. 그리고 그것은 저에게 똑똑한 움직임처럼 들리지는 않습니다. ...
정보 주셔서 감사합니다!:-) 귀하의 답변은 확실히 유익한 동안, 그것은 정말로 내 타임 스탬프가없는 타임 스탬프가 내 데이터베이스에 삽입되는 것을 방지하는 나의 문제에 도움이되지 않습니까? – ssc
나는 당신의 "일반적인 오해"를 해결하려고 노력했다. 문제 해결에 도움이되도록 PostgreSQL의'SQL' 함수 *에 삽입 된 것이 무엇을 의미하는지 설명 할 수 있습니까? –