복붙노트

[SQL] PostgreSQL의 두 날짜 사이의 결과를 얻기

SQL

PostgreSQL의 두 날짜 사이의 결과를 얻기

나는 다음과 같은 테이블이 있습니다 :

+-----------+-----------+------------+----------+
| 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. ==============================

    1.

     SELECT *
       FROM mytable
      WHERE (start_date, end_date) OVERLAPS ('2012-01-01'::DATE, '2012-04-12'::DATE);
    

    날짜 시간 기능은 문서의 관련 섹션입니다.

  2. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.그렇지 않은 작업을 수행하는 날짜를 보면 - 그 하루 12 같음보다 작거나입니다 - 그것은 YYYY-DD-MM 형식에있는 것으로 날짜를 구문 분석하든 내가 궁금하네요?

    그렇지 않은 작업을 수행하는 날짜를 보면 - 그 하루 12 같음보다 작거나입니다 - 그것은 YYYY-DD-MM 형식에있는 것으로 날짜를 구문 분석하든 내가 궁금하네요?

  6. ==============================

    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. ==============================

    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. ==============================

    8.

    SELECT *
    FROM ecs_table
    WHERE (start_date, end_date) OVERLAPS ('2012-01-01'::DATE, '2012-04-12'::DATE + interval '1');
    
  9. from https://stackoverflow.com/questions/10170544/getting-results-between-two-dates-in-postgresql by cc-by-sa and MIT license