2014-09-19 4 views
0

날짜 범위를 찾을 때 어쨌든 generate_series에 시작일과 종료일도 반환합니까? generate_series 쿼리에 열을 추가하는 방법

select 
    '2014-06-05 00:00:00'::timestamp + ('1 month'::INTERVAL * s.a) AS date 
from 
    generate_series(1, cast(extract(month from age('2014-09-05'::date, '2014-06-05'::date)) AS integer), 1) as s(a); 

이 괜찮

date 
2014-07-05 00:00:00 
2014-08-05 00:00:00 
2014-09-05 00:00:00 

는, 그러나 나는 이유의 존재가 내가 다른 테이블에서 여러 시작/끝 쌍을 추출하고 있다는 점이다

start_date  end_date  date 
2014-06-05 2014-09-05 2014-07-05 00:00:00 
2014-06-05 2014-09-05 2014-08-05 00:00:00 
2014-06-05 2014-09-05 2014-09-05 00:00:00 

하고 싶은이 출력을 제공합니다 그러나 그것들을 결합시키는 방법을 이해할 수는 없습니다. 또한 PostgeSQL 버전 8.2.15를 사용하고 있습니다 (그러므로 더 복잡한 generate_series 기능).

이 문제를 주요 문제로 확장하려면 이러한 시작 및 종료 시간 쌍이 포함 된 표가 있습니다.

start_date   end_date 
2014-08-25 00:00:00 2014-09-25 00:00:00 
2014-05-16 00:00:00 2014-08-16 00:00:00 
2014-09-09 00:00:00 2014-12-09 00:00:00 
2014-06-05 00:00:00 2014-07-05 00:00:00 
2014-05-19 00:00:00 2014-08-19 00:00:00 
2014-05-15 00:00:00 2014-07-15 00:00:00 
2014-09-04 00:00:00 2014-11-04 00:00:00 

어떻게이 테이블을 반복하고 확장 된 기간과 결합 할 수 있습니까?

+0

없이

SELECT start_date, end_date ,(start_date + interval '1 month' * generate_series(1, months))::date AS the_date FROM (SELECT *, extract(month FROM age(end_date, start_date))::int AS months FROM t) sub; 

쿼리의 일부, 나는 당신을 믿고있어 실제 문제는이 쿼리를 어딘가에 생성하고 해당 값을 한 번만 입력하려는 것입니다. 하지만 이미 쿼리에서 시작 날짜를 두 번 언급하고 있습니다 ... – IMSoP

+0

@IMSoP 예, 다른 테이블에서 시작 (2014-06-05) 및 종료 (2014-09-05) 값을 얻고 있습니다. 나는 단순한 예제를 제공하는 것이 내가 그 일을 성취 할 수 없을 때 가장 도움이 될 것이라고 생각했다. – cdeterman

+1

이 경우에는 지나치게 단순화했습니다. 정확한 시나리오는 간단합니다. 'Choose'2014-09-05 :: date as start_date, '2014-06-05':: date as end_date , '2014-06-05 00:00:00':: timestamp + ('1 개월':: INTERVAL * sa) AS 날짜 ... '이 정보를 Google에 어떻게 결합할지 표시해야합니다. 다른 테이블 또는 최소한 입력 데이터에 대한 추가 정보를 제공하십시오. – IMSoP

답변

1

current version으로 업그레이드하는 것이 좋습니다. Postgres 8.2는 오래 동안 잊혀진 상태입니다.

Postgres 8.2 (또는 이후 버전)에는 현대적인 Postgres에서보다 세련된 해결책이 있습니다.

가정 할 때 모두날짜는이며 타임 스탬프는 아닙니다.

일단 start_dateend_date제공 :

SELECT start_date, end_date 
    , (start_date + interval '1 month' 
        * generate_series(1, months))::date AS the_date 
FROM ( 
    SELECT extract(month from age(end_date, start_date))::int AS months 
     , start_date, end_date 
    FROM (SELECT '2014-06-05'::date AS start_date 
       , '2014-09-05'::date AS end_date 
     ) data 
    ) sub; 

열 이름 the_date 대신 식별자로 사용하지 않아야 date 사용. 대신 테이블 t에서

그리기 값 : 추가하려는 두 개의 열이 있기 때문에 하위 쿼리

SELECT t_id, start_date, end_date 
    ,(start_date + interval '1 month' 
        * generate_series(1, extract(month from age(end_date 
                  , start_date))::int) 
       )::date AS the_date 
FROM t; 

SQL Fiddle for Postgres 8.3.

+0

이것은 매우 가깝지만, 나는 초기 질문을 편집했다. 다른 테이블에서 날짜를 그리는 중입니다. 어떻게 테이블을 확장하여 날짜 범위를 포함시킬 수 있습니까? 또한 가능한 경우 버전을 기꺼이 업데이트하지만 내 회사는 현재이 버전을 가지고 있으며 업그레이드 속도가 느립니다. – cdeterman

+0

@charles : 더 추가했습니다. 그것이 타임 스탬프가 아니라 날짜에 관한 것이라고 가정합니다. –

+1

지연 접수를 위해 죄송합니다. 나는 지난 주말에 마을 밖으로 나가야했고이 질문에 대해 많은 시간을 들여 조사하지 않았다. 대단히 감사합니다.이 코드는 완벽하게 작동합니다. – cdeterman

관련 문제