2013-07-16 1 views
2

나는 여러 개의 정수 열이있는 테이블을 가지고 있습니다 : 년, 월, 일. 불행히도 처음부터 세 개의 DATE 열로 그룹화해야했지만 지금은 고민 중입니다. 이제는 그걸 볼 필요가 있습니다.PostgreSQL : DATE 또는 TIMESTAMP로 정수 선택

SELECT makedate(year, month, day), othercolumn FROM tablename; 

또는

SELECT maketimestamp(year, month, day, 0, 0), othercolumn FROM tablename; 
+0

관심이 있으시면'makedate'와'maketimestamp'를 사용하는 데 어떤 DB를 사용하고 계십니까? 문서 도구 링크? PostgreSQL의 버전이 일관성이 있는지 확인하고 싶습니다. –

+0

특정 DB를 생각하지 않았습니다. 하지만 MySQL에는 makedate와 비슷한 것이 있다고 생각합니다 (몇 달을 사용하지 않지만). – TimY

+0

그럴지라도, 1 년과 1 년이 걸린다. (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html). [MySQL에는 여러분 중 하나와 정확히 똑같은 것이 없습니다.] (http://stackoverflow.com/q/3960049/398670). –

답변

8

할 수 있습니다

SELECT format('%s-%s-%s', "year", "month", "day")::date 
FROM ... 

또는 사용 날짜 수학 :

SELECT DATE '0001-01-01' 
    + ("year"-1) * INTERVAL '1' YEAR 
    + ("month"-1) * INTERVAL '1' MONTH 
    + ("day"-1) * INTERVAL '1' DAY 
FROM ... 

솔직히, 그것은 당신이 설명처럼 PostgreSQL을이 날짜 생성자를 제공하지 않는 것은 놀라운 일이다. 패치 작성에 대해 생각해야 할 부분입니다.

사실 소스를 간략하게 살펴보면 에 이미 C 레벨에 int date2j(int y, int m, int d) 기능이 있음을 알 수 있습니다. Datum로 변환하는 래퍼를 사용하여 SQL 수준에 노출하면됩니다.

OK, now here's a simple makedate extension은 C로 구현 된 단일 함수를 추가하고 이름은 makedate입니다. 확장을 컴파일하고 설치하지 않으려는 경우 pure-SQL 버전도 제공됩니다. 나는 9.4 커밋을위한 C 함수를 제출할 것이다. 한편이 확장 빠르고 간단한 날짜 생성자 제공하기 위해 설치할 수 있습니다

regress=# SELECT makedate(2012,01,01); 
    makedate 
------------ 
2012-01-01 
(1 row) 
+2

+1 : 특히 날짜 생성자를 제출하는 경우) –

-1

시도 같은 :

SELECT year * interval '1 year' + 
     month * interval '1 month' + 
     day * interval '1 day' 
FROM tablename; 
+1

날짜 형식 결과를 얻으려면 날짜에 추가해야한다고 생각합니다. 일정 간격을 제공합니다. –

1

더 우아한 방법이있을 수 있지만 의지의 라인을 따라 뭔가를 할 수있는 기능이 있나요 데이트 줘.

select to_date(to_char(year * 10000 + month * 100 + day,'00000000'), 'yyyymmdd') 
from tablename; 
관련 문제