database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7337 게시물 읽기
No. 7337
now()시 뒤죽박죽현상
작성자
영광
작성일
2008-02-13 18:19
조회수
7,091

안녕하세요
기이한 현상이 생겨 참 애매해서 염치불구하고 질문 올립니다.

처음에는 프로그램이 있는 서버에 쓰다가 디비서버로 옮길일이 있어서 일하다 발생한 일입니다.
프로그램에서 데이타를 인서트 하기 위해 디비서버가 있는 곳으로 접속해 쿼리를 날렸습니다.
그런데 now()함수를 디비서버가 있는 곳에서 실행하여 그 디비서버의 시간을 얻어와 필드에 저장을
하게 되는데요, select해서 그 테이블의 데이타들을 살펴보면 전혀 시간이 맞지 않고 시간 순서 또한 엉켜
있네요.. 

왜 이런 현상이 발생하나요?
한참 헤매다보니 도저히 못 찾겠더군요.. 
혹 아시는 분이 계시면 한 수 부탁드립니다..

좋은 하루 되십시오~

이 글에 대한 댓글이 총 4건 있습니다.

입력할 때 now()를 쓰게 되면 now()는 현재 DB서버의 시간에 맞춰서 들어가게 됩니다.

그런데 이 시간이 입력된 필드가 timestamp "with time zone" 형식이라면

클라이언트에서 select 시간필드 from 테이블; 하게 되면

클라이언트의 타임존 설정대로 시간을 변환해서 가져오게 됩니다.

 

DB서버에서는 timestamp with time zone으로 저장되면 이것은 전 세계 어디에서나 볼 때 절대적인 시간으로 저장됩니다. 클라이언트의 시간대 설정이 Asia/Seoul이라면 +9:00 된 시간이 오고 영국이라면 UTC표준시로 시간이 리턴됩니다. 시스템의 시간 설정에 따르게 되고 각 언어에서 타임존을 설정할 수 있습니다.

또는 PGTZ라는 환경변수로 바꿀 수 있습니다. 이놈은 DB서버 접속하기 전에 설정되어 있어야 합니다.

 

SQL로 타임존 설정: set timezone to 'Asia/Seoul'; (서울 기준)

PHP: 접속 전에 putenv('PGTZ=UTC'); (UTC로 설정)

 

 

신기배(소타)님이 2008-02-13 22:40에 작성한 댓글입니다.

신기배님 답변 정말 감사합니다...

디비서버는 without time zone로 되 있습니다. 님이 말씀하신 대로 절대적인 시간이 와야 될텐데
디비에 쌓인 데이타와 클라이언트서버에 남은 로그파일을 비교해보면 시간이 전혀 맞지 않을뿐더러
시간이 절대적이건 상대적이건 순서에 맞게 쌓여야 되는데 

2008-02-13 12:00:00 .......... 이런 데이타가 있다면
그 이후에 인서트되어 저장되는 데이타가 뜬금없이
2008-02-13 09:30:00 .......... 이런식으로 와버립니다...;;;

클라이언트에서 날린 쿼리문으로 클라이언트서버내 디비에 잘 들어갔거든요
그리고 디비서버에서 직접 인서트문 쿼리 날렸을 때는 잘 들어가는거 확인했습니다..

대체 뭘까요 이건...;;;



영광님이 2008-02-14 18:09에 작성한 댓글입니다. Edit

헐; 이상한 현상이네요 -.-;

 

그냥 psql로 접속해서 now()로 입력하고 그 다음에 바로 다시 now()로 입력해도 그런가요?

아니면 중간에 pgpool이나 이런게 있는건지.. 아니면 pgcluster를 사용중이신지..

without time zone 상태라도 클라이언트의 시간대 설정에 따라 시간이 입력되게 됩니다. without 과 with 의 차이점은 with일 경우 DBMS가 절대적인 시간을 가지고 있고 타임존에 따라 변환해서 준다는 거고 without의 경우 그 절대적인 시간 자체가 현재 타임존 설정대로 입력되고 이 시간을 with time zone인 상태로 캐스트 하고 필요하면 at time zone '...' 으로 시간대 변경을 해서 가져오게 됩니다..

 

시간이 그렇게 요동치는건.. 음..

예를 들어 오전 8시에 begin; 한 후에 select now(); 하면 오전 8시입니다. 이 트랜젝션이 끝나지 않고 한시간 후에 select now() 하면 역시 오전 8시 입니다. 실제로는 9시더라도요.. 트랜젝션의 시작 시간에 맞춰서 now() 가 고정되거든요.

혹시 중간에 pgpool이 오동작 해서 기존 세션의 트랜젝션이 정상적으로 종료되지 않고 reset all; 같은게 동작하지 않았거나..

 

음.. 답이 안나오네요 -.-;; 일단 pgsql을 최신버전으로 올려보시라는 -.-;;

신기배(소타)님이 2008-02-14 23:23에 작성한 댓글입니다.

음...

디비서버쪽은 제가 관리를 하지 않아서 어떻게 쓰고 있는지 잘 모르겠으나

그전에 디비서버에 쓸 때는 잘 인서트 됐던걸로 기억합니다. 그리고 다른 디비서버에 테이블들도 

잘 쓰고 있는 걸로 알고 있습니다..

참 이상한 노릇이네요... 디비서버도 잘 되 있고 클라이언트도 쿼리문은 바뀐게 없는데 ;;

일정하게 변하는게 아니어서 예측하기도 그렇고... 

답변 정말 감사합니다..  

영광님이 2008-02-15 09:42에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7340이거 가능할까요?(query) [4]
임형구
2008-02-18
5963
7339Linux 에 있는 PostgreSQL을 win2003의 mssql과 odbc 연결했습니다.
민재홍
2008-02-18
6158
7338like 검색에서 index 사용. [1]
백수환
2008-02-16
5808
7337now()시 뒤죽박죽현상 [4]
영광
2008-02-13
7091
7325OID란 무엇인가요? [2]
성진
2008-02-09
8864
7324다른 데이타 베이스에 존재하는 table join 도와주세요.. [1]
임병민
2008-02-09
5730
7323MySQL vs PostgreSQL wiki [3]
최정대
2008-02-05
6900
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다