리스트 - mysql 두 날짜 사이 의 날짜 목록




PostgreSQL의 범위에있는 날짜 목록 가져 오기 (6)

PostgreSQL 데이터베이스 에서 두 날짜 (그 날짜 포함) 간의 날짜 목록을 얻고 싶습니다. 예를 들어, 내가 가지고있는 경우 :

  • 시작일 : 2012 년 6 월 29 일
  • 종료일 : 2012 년 7 월 3 일

결과는 다음과 같아야합니다.

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

PostgreSQL에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

감사.


날짜 범위를 테이블 식에서 가져온 경우 다음 구문을 사용할 수 있습니다.

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 ()가 날짜 인수를 사용하지 않기 때문에 형변환이 필요합니다.


이 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

이런 식의 경우 일반적으로 시스템에 날짜 테이블을 갖는 것이 편리합니다.

숫자 테이블과 마찬가지로, 특히 큰 데이터 세트로 확장 할 때 날짜를 생성하는 것보다 사용하는 것이 매우 유용하고 빠를 수 있습니다.

1900 년부터 2100 년까지의 날짜 표는 매우 작을 것이므로 저장 용량이 지나치게 많지는 않습니다.

편집 : 이것이 왜 투표를 거절하는지 모르겠다. 아마 성능면에서 최고 일 것이다. 게다가 다른 많은 장점이 있습니다. 주문을 분기 실적 수치에 연결하고 싶습니까? 그것은 테이블 간의 간단한 링크입니다. (Order.OrderDate -> Dates.Date -> Dates.Quarter -> PerformanceTotal.Quarter) 등이 있습니다. 월의 마지막 근무일 또는 지난 달의 첫 번째 화요일과 같은 근무일을 처리 할 때와 동일합니다. 숫자 표와 마찬가지로, 나는 그들을 강력히 추천합니다!


쿼리하려는 데이터베이스가 이미있는 경우 :

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"

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

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




date-comparison