programing

날짜 범위 간의 postgresql 쿼리

starjava 2023. 5. 7. 10:44
반응형

날짜 범위 간의 postgresql 쿼리

날짜가 특정 월과 연도인 경우 결과를 반환하기 위해 postgresql db를 쿼리하려고 합니다.즉, 한 달 동안의 모든 값을 원합니다.

제가 지금까지 할 수 있었던 유일한 방법은 다음과 같습니다.

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'

문제는 표를 조회하기 전에 첫 번째 날짜와 마지막 날짜를 계산해야 한다는 것입니다.이것을 하는 더 간단한 방법이 있습니까?

감사해요.

날짜(및 시간)와 함께 사용하면 많은 것이 단순해집니다.>= start AND < end.

예:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

이 경우에도 필요한 달의 시작 날짜를 계산해야 하지만 여러 가지 방법으로 쉽게 계산할 수 있습니다.

종료 날짜도 단순화됩니다. 정확히 한 달만 추가하면 됩니다.28일, 30일, 31일 등을 가지고 장난치지 마세요.


이 구조는 인덱스 사용을 유지할 수 있다는 장점도 있습니다.


많은 사용자가 다음과 같은 양식을 제안할 수 있지만 인덱스를 사용하지 않습니다.

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

여기에는 테이블의 모든 단일 행(스캔)에 대한 조건을 계산하고 인덱스를 사용하여 일치할 행 범위(범위 검색)를 찾지 않는 작업이 포함됩니다.

포스투레에서SQL 9.2 범위 유형이 지원됩니다.따라서 다음과 같이 쓸 수 있습니다.

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

이것은 문자열 비교보다 더 효율적이어야 합니다.

누군가가 여기에 착륙할 경우를 대비해서...8.1 이후에는 간단하게 다음을 사용할 수 있습니다.

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

문서에서:

BETH 대칭은 BETHIN과 동일합니다. 단, 왼쪽에 있는 인수가 오른쪽에 있는 인수보다 작거나 같아야 한다는 요구 사항은 없습니다.그렇지 않으면 두 인수가 자동으로 스왑되므로 항상 비어 있지 않은 범위가 암시됩니다.

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'

날짜에 대해 Between 키워드가 예외적으로 작동합니다.날짜에 대한 시간을 00:00:00(즉, 자정)으로 가정합니다.

설명서를 읽습니다.

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

다음과 같은 쿼리를 사용했습니다.

WHERE
(
    date_trunc('day',table1.date_eval) = '2015-02-09'
)

또는

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')    

언급URL : https://stackoverflow.com/questions/23335970/postgresql-query-between-date-ranges

반응형