[SQL] PostgreSQL을의 범위에서 날짜 목록을 얻기
SQLPostgreSQL을의 범위에서 날짜 목록을 얻기
나는 PostgreSQL 데이터베이스에서 (이를 포함) 두 날짜 사이의 일의 목록을 좀하고 싶습니다. 예를 들어, 내가 가진 경우 :
결과는해야한다 :
29 june 2012
30 june 2012
1 july 2012
2 july 2012
3 july 2012
PostgreSQL의에서이 작업을 수행하는 가장 좋은 방법이 있을까요?
감사.
해결법
-
==============================
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.타임 스탬프 :
타임 스탬프 :
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.이것은을 수행해야합니다
이것은을 수행해야합니다
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.시스템의 날짜 테이블을 가지고는 일반적으로 편리한이 같은 것들하십시오.
시스템의 날짜 테이블을 가지고는 일반적으로 편리한이 같은 것들하십시오.
그냥 숫자 테이블처럼 그들은 당신이 대용량 데이터 세트까지 확장 특히, 즉석에서 날짜를 생성하는 것보다 매우 유용하고 빨리 사용에 될 수 있습니다.
1900에서 2100 이러한 날짜 테이블은 너무 저장소에 머리를 많이가없는, 아주 작은 것입니다.
편집 :이 부결지고 왜 몰라, 그것은 아마 성능을 위해 최선 될 것입니다. 게다가 그것은 다른 많은 장점이 있습니다. 분기의 성능 수치 A를 주문 링크를 원하십니까? 테이블 간의 그것의 단순 링크. (Order.OrderDate -> Dates.Date -> Dates.Quarter -> PerformanceTotal.Quarter) 등이 그 달의 마지막 작업 일 또는 이전 달의 첫 번째 화요일처럼 일 처리에 대해 동일합니다. 번호 테이블처럼, 나는 강하게을 권 해드립니다!
-
==============================
5.
select generate_series('2012-06-29', '2012-07-03', '1 day'::interval)::date;
-
==============================
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.날짜 범위는 테이블 표현식에서 온해야하는 경우 다음과 같은 구문을 사용할 수 있습니다 :
날짜 범위는 테이블 표현식에서 온해야하는 경우 다음과 같은 구문을 사용할 수 있습니다 :
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.이 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
from https://stackoverflow.com/questions/11391085/getting-date-list-in-a-range-in-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 다른 테이블 칼럼에 기초하여 계산 열의 수식 (0) | 2020.04.25 |
---|---|
[SQL] SQL에서 임시 테이블 만들기 (0) | 2020.04.25 |
[SQL] SQL은 월 및 연도에 의해 그룹화 (0) | 2020.04.25 |
[SQL] 두 날짜 사이의 개월 (0) | 2020.04.25 |
[SQL] 테이블의 한 열을 기준으로 중복 된 값을 제거 (0) | 2020.04.25 |