>>정재익 님께서 쓰시길<<
:: 시간 정보를 PostgreSQL 에 저장하는 방법은 여러가지 있습니다. 시간에 관한 자료형이 그만큼 Postgre
:: SQL 에서는 복잡하게 되어 있기 때문입니다.
::
:: 가장 많이 사용하는 형은 아마도 timestamp 형과 abstime 형이 아닐까 생각합니다. 하지만 개인적으로
:: 는 그냥 int 형을 많이 이용합니다. int 형에 어떻게 시간을 저장하냐고요. 그냥 unix time 함수에서
:: 돌아온 값 (1970.1.1 시작부터 현재까지 흐른 시간을 초단위로 표시) 을 정수 그대로 저장해 둡니다.
:: 이것을 나중에 postgresql 에서 필요할 경우 적당히 가공하여 사용하면 됩니다.
::
:: select now()::abstime::integer;
:: 이렇게 하면 현재의 unix time() 함수 값을 확인할 수 있습니다.
::
:: 그리고 만약 time 이라는 필드에 정수로 그 값이 저장되어 있다면 그 시간을 알아 보고자 한다면 다음
:: 과 같이 하면 됩니다.
::
:: select time::abstime from table_name where condition;
::
:: 간단하게 처리가 가능하죠. :/) 아니면 datetime() 함수를 이용해도 됩니다. 위의 방법은 casting 연
:: 산자를 이용한 방법이지요. :/) 이렇게 하면 그냥 익숙한 정수형으로 시간의 처리가 어느 정도 가능해
:: 집니다.
::
문제는
ioseph=# select '2038/01/19 12:14:06'::abstime::int;
?column?
////////////
2147483646
(1 row)
ioseph=# select '2038/01/19 12:14:07'::abstime::int;
?column?
////////////
2147483646
(1 row)
이것이겠지요.
또다른 문제는 시간자료형에 대한 연산부분일터인데,
시간에 대한 연산은 일반적으로 며칠/몇분 뒤/앞, 또는
생일 처럼 '모든년도의 같은 생일" 이런 연산이 되부분일터인데,
이런 연산을 위해서라면, unix C의 time 값(4byte interger)으로
처리하기보다는 PostgreSQL의 기본 날짜 자료형인 timestamp 를 쓰는 것이
훨씬 편할 것같네요.
/////////
여담으로 이곳 판매 데이터에 대한 테이블 설계를 다른 곳에서 했는데,
그곳에서는 날짜형을 varchar형로 했더군요.('20010122' 이런식으로)
(오라클을 사용하니까, 오라클의 date형보다는 varchar형이 입/출력하기에
편하니까 그렇게 했나봅니다)
이렇게 하다보니, 그냥 특정 날짜의 자료를 뽑는데는 별로 지장이 없는데,
앞에서 말한 날짜 관련 연산이 필요한 쿼리에서는 date형을 쓸때보다
훨씬 쿼리가 복잡해지더군요.
이처럼 날짜와 시간에 관련된 자료형 문제는
그 자료가 어떠한 용도로 쓰일 것인가?
이것에 따라서 적당한 자료형을 사용해야할 것같습니다.
(이부분은 딱히 꼭 이런 경우에는 이렇게 ... 저런 경우에는 저렇게...
이런 것이 없는 것 같습니다.
결국은 테이블설계자의 오랜 경험(그 무서운 직관력)에 달려있는 것같습니다)
|