[SQL] PostgreSQL의 두 날짜 사이의 결과를 얻기
SQLPostgreSQL의 두 날짜 사이의 결과를 얻기
나는 다음과 같은 테이블이 있습니다 :
+-----------+-----------+------------+----------+
| id | user_id | start_date | end_date |
| (integer) | (integer) | (date) | (date) |
+-----------+-----------+------------+----------+
필드의 시작일과 종료일은 YYYY-MM-DD와 같은 날짜 값을 들고 있습니다.
이 테이블의 항목은 다음과 같이 할 수 있습니다 : (1, 120, 2012-04-09, 2012-04-13).
나는 일정 기간이 일치하는 모든 결과를 가져올 수있는 쿼리를 작성해야합니다.
문제는 내가 2012-04-12에 2012-01-01의 결과를 가져 오기 할 경우 종료일 = "2012-04"2012-04-09 "_ 날짜 =이있는 항목이 있더라도, 내가 0 결과를 얻을 수 있다는 것입니다 -13 ".
해결법
-
==============================
1.
SELECT * FROM mytable WHERE (start_date, end_date) OVERLAPS ('2012-01-01'::DATE, '2012-04-12'::DATE);
날짜 시간 기능은 문서의 관련 섹션입니다.
-
==============================
2.당신은 즉 모든 "중복"기간, 공통으로 적어도 하나의 일이 모두가 원하는 가정.
당신은 즉 모든 "중복"기간, 공통으로 적어도 하나의 일이 모두가 원하는 가정.
직선 타임 라인에 구상의 기간에 시도하고 당신의 눈 전에 주위에 이동하고 당신은 필요한 조건을 볼 수 있습니다.
SELECT * FROM tbl WHERE start_date <= '2012-04-12'::date AND end_date >= '2012-01-01'::date;
(@Marco 이미 규정)을 할 수있는 다른 좋은 방법입니다 - 이것은 중복보다 때로는 더 빨리 나를 위해입니다.
(문서 당) 미묘한 차이를 참고 :
굵게 강조 광산.
큰 테이블의 권리 지수는 성능 (많이) 도움이 될 수 있습니다.
CREATE INDEX tbl_date_inverse_idx ON tbl(start_date, end_date DESC);
아마도 다른 (선도) 인덱스 컬럼는 추가 선택 조건이있는 경우.
두 열의 역순 참고. 상해:
-
==============================
3.그냥 같은 질문을했다,이 도울 수 있다면, 이런 식으로 대답했다.
그냥 같은 질문을했다,이 도울 수 있다면, 이런 식으로 대답했다.
select * from table where start_date between '2012-01-01' and '2012-04-13' or end_date between '2012-01-01' and '2012-04-13'
-
==============================
4.로케일 설정에서 작업 쿼리를하려면 날짜를 직접 서식을 고려 :
로케일 설정에서 작업 쿼리를하려면 날짜를 직접 서식을 고려 :
SELECT * FROM testbed WHERE start_date >= to_date('2012-01-01','YYYY-MM-DD') AND end_date <= to_date('2012-04-13','YYYY-MM-DD');
-
==============================
5.그렇지 않은 작업을 수행하는 날짜를 보면 - 그 하루 12 같음보다 작거나입니다 - 그것은 YYYY-DD-MM 형식에있는 것으로 날짜를 구문 분석하든 내가 궁금하네요?
그렇지 않은 작업을 수행하는 날짜를 보면 - 그 하루 12 같음보다 작거나입니다 - 그것은 YYYY-DD-MM 형식에있는 것으로 날짜를 구문 분석하든 내가 궁금하네요?
-
==============================
6.당신은 날짜 부분을 가져 오는 방법을 사용해야합니다 :
당신은 날짜 부분을 가져 오는 방법을 사용해야합니다 :
SELECT * FROM testbed WHERE start_date ::date >= to_date('2012-09-08' ,'YYYY-MM-DD') and date::date <= to_date('2012-10-09' ,'YYYY-MM-DD')
-
==============================
7.하지만 SQL의 성능을 확인하는 기분 나쁘게 내가 위에서 언급 한 solutiona의 pgSQL의 일부를 실행하지 않습니다.
하지만 SQL의 성능을 확인하는 기분 나쁘게 내가 위에서 언급 한 solutiona의 pgSQL의 일부를 실행하지 않습니다.
나를 상단의 당신 통계를 공유 할 수 3 솔루션은 내가 건너 것을 접근한다.
1) 툭 : 1.58 MS 평균
2) 툭 : 2.87 MS 평균
3) 툭 : 3.95 MS 평균
지금보십시오 :
SELECT * FROM table WHERE DATE_TRUNC('day', date ) >= Start Date AND DATE_TRUNC('day', date ) <= End Date
이제이 솔루션에 나섭니다 : 1.61의 매력에 빠져보십시오.
그리고 가장 좋은 방법은 마르코 - MARIANI 제안하는 것이 첫번째입니다
-
==============================
8.
SELECT * FROM ecs_table WHERE (start_date, end_date) OVERLAPS ('2012-01-01'::DATE, '2012-04-12'::DATE + interval '1');
from https://stackoverflow.com/questions/10170544/getting-results-between-two-dates-in-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 부울 필드 색인 (0) | 2020.07.23 |
---|---|
[SQL] 간단한 날짜 시간 SQL 쿼리 (0) | 2020.07.23 |
[SQL] 조건이 동일하지 않은 SQL? (0) | 2020.07.23 |
[SQL] 오라클 테이블의 재 순서는 열 (0) | 2020.07.23 |
[SQL] 후 SQL Server의 특정 문자 앞에 모든 것을 얻을 (0) | 2020.07.23 |