복붙노트

[SQL] PostgreSQL을의 범위에서 날짜 목록을 얻기

SQL

PostgreSQL을의 범위에서 날짜 목록을 얻기

나는 PostgreSQL 데이터베이스에서 (이를 포함) 두 날짜 사이의 일의 목록을 좀하고 싶습니다. 예를 들어, 내가 가진 경우 :

결과는해야한다 :

29 june 2012
30 june 2012 
1 july 2012 
2 july 2012 
3 july 2012

PostgreSQL의에서이 작업을 수행하는 가장 좋은 방법이 있을까요?

감사.

해결법

  1. ==============================

    1.

    select CURRENT_DATE + i 
    from generate_series(date '2012-06-29'- CURRENT_DATE, 
         date '2012-07-03' - CURRENT_DATE ) i
    

    심지어 짧은은 :

    select i::date from generate_series('2012-06-29', 
      '2012-07-03', '1 day'::interval) i
    
  2. ==============================

    2.타임 스탬프 :

    타임 스탬프 :

    select generate_series('2012-06-29', '2012-07-03', '1 day'::interval);
    
        generate_series     
    ------------------------
     2012-06-29 00:00:00-03
     2012-06-30 00:00:00-03
     2012-07-01 00:00:00-03
     2012-07-02 00:00:00-03
     2012-07-03 00:00:00-03
    

    또는 날짜에 주조 :

    select (generate_series('2012-06-29', '2012-07-03', '1 day'::interval))::date;
    
     generate_series 
    -----------------
     2012-06-29
     2012-06-30
     2012-07-01
     2012-07-02
     2012-07-03
    
  3. ==============================

    3.이것은을 수행해야합니다

    이것은을 수행해야합니다

    select date '2012-06-29' + i
    from generate_series(1, (select date '2012-07-3' - date '2012-06-29')) i
    

    당신은 부속의 상황이 좀 더 복잡의 시작일를 반복하지 않으려면 :

    with min_max (start_date, end_date) as (
       values (date '2012-06-29', date '2012-07-3')
    ), date_range as (
      select end_date - start_date as duration
      from min_max
    )
    select start_date + i
    from min_max
      cross join generate_series(1, (select duration from date_range)) i;
    

    (이하 "노 반복"문제의 더 나은 버전에 대한 참조 maniek의 대답)

  4. ==============================

    4.시스템의 날짜 테이블을 가지고는 일반적으로 편리한이 같은 것들하십시오.

    시스템의 날짜 테이블을 가지고는 일반적으로 편리한이 같은 것들하십시오.

    그냥 숫자 테이블처럼 그들은 당신이 대용량 데이터 세트까지 확장 특히, 즉석에서 날짜를 생성하는 것보다 매우 유용하고 빨리 사용에 될 수 있습니다.

    1900에서 2100 이러한 날짜 테이블은 너무 저장소에 머리를 많이가없는, 아주 작은 것입니다.

    편집 :이 부결지고 왜 몰라, 그것은 아마 성능을 위해 최선 될 것입니다. 게다가 그것은 다른 많은 장점이 있습니다. 분기의 성능 수치 A를 주문 링크를 원하십니까? 테이블 간의 그것의 단순 링크. (Order.OrderDate -> Dates.Date -> Dates.Quarter -> PerformanceTotal.Quarter) 등이 그 달의 마지막 작업 일 또는 이전 달의 첫 번째 화요일처럼 일 처리에 대해 동일합니다. 번호 테이블처럼, 나는 강하게을 권 해드립니다!

  5. ==============================

    5.

    select generate_series('2012-06-29', '2012-07-03', '1 day'::interval)::date;
    
  6. ==============================

    6.이미 데이터베이스가있는 경우 당신은 쿼리에 원하는 :

    이미 데이터베이스가있는 경우 당신은 쿼리에 원하는 :

    SELECT
       TO_CHAR(date_column,'DD Mon YYYY')
    FROM
       some_table
    WHERE
       date_column BETWEEN '29 Jun 2012' AND '3 JUL 2012'
    
    GROUP BY date_column
    ORDER BY date_column
    

    이 발생합니다 :

    "29 Jun 2012"
    "30 Jun 2012"
    "01 Jul 2012"
    "02 Jul 2012"
    "03 Jul 2012"
    
  7. ==============================

    7.날짜 범위는 테이블 표현식에서 온해야하는 경우 다음과 같은 구문을 사용할 수 있습니다 :

    날짜 범위는 테이블 표현식에서 온해야하는 경우 다음과 같은 구문을 사용할 수 있습니다 :

    DROP TABLE tbl ;
    CREATE TABLE tbl (zdate date NOT NULL );
    INSERT INTO tbl(zdate) VALUES( '2012-07-01') , ('2012-07-09' );
    
    WITH mima AS (
            SELECT MIN(zdate)::timestamp as mi
            , MAX(zdate)::timestamp as ma
            FROM tbl
            )
    SELECT generate_series( mima.mi, mima.ma, '1 day':: interval):: date
    FROM mima
            ;
    

    캐스트는 날짜 인수를하지 않습니다 () generate_series 때문에 필요하다.

  8. ==============================

    8.이 PLpg / SQL 기능은 트릭을 할 것입니다 :

    이 PLpg / SQL 기능은 트릭을 할 것입니다 :

    CREATE OR REPLACE FUNCTION getDateList(date1 date, date2 date)
    RETURNS SETOF date AS
    $BODY$
    DECLARE
        count integer;
        lower_limit integer :=  0;
        upper_limit integer :=  date2 - date1;
    BEGIN
        FOR count IN lower_limit..upper_limit LOOP
            RETURN NEXT date1 + count;
        END LOOP;
        RETURN;
    END;
    $BODY$
    LANGUAGE plpgsql VOLATILE
    
  9. from https://stackoverflow.com/questions/11391085/getting-date-list-in-a-range-in-postgresql by cc-by-sa and MIT license