programing

Postgresql의 datetime 필드의 날짜를 비교하는 방법

mbctv 2023. 4. 16. 15:34
반응형

Postgresql의 datetime 필드의 날짜를 비교하는 방법

postgresql(윈도우의 경우 버전 9.2.4)의 날짜를 비교할 때 이상한 시나리오가 발생했습니다.

제 테이블에 다음과 같은 칼럼이 있습니다.update_date활자를 쳐서timestamp without timezone.
클라이언트는 날짜만 사용하여 이 필드를 검색할 수 있습니다(예:2013-05-03) 또는 시간과 함께 날짜(예: 2013-05-03 12:20:00).

이 열에는 현재 모든 행에 대한 타임스탬프 값이 있으며 날짜 부분이 동일합니다.2013-05-03, 하지만 시간 부분에서의 차이.

이 칼럼을 비교해보니 다른 결과가 나오네요.다음과 같습니다.

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results

select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found

select * from table where update_date >= '2013-05-03' -> results found

제 질문은 첫 번째 쿼리를 어떻게 하면 결과를 얻을 수 있을까요? 즉, 첫 번째 쿼리가 아닌 세 번째 쿼리가 왜 기능하는 걸까요?

@Nicolai는 캐스팅에 대해 옳고, 왜 어떤 데이터에 대해서도 조건이 잘못된 것인지, 입력 문자열에 날짜 조작을 피하고 싶기 때문에 첫 번째 폼을 선호하고 있는 것이 맞습니까?두려워할 필요 없어

SELECT *
FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);

비교해보면update_date >= '2013-05-03'postgres는 값을 동일한 유형으로 캐스팅하여 값을 비교합니다.따라서 '2013-05-03'은 '2013-05-03 00:00:00'로 캐스팅되었습니다.

따라서 update_date = '2013-05-03 14:45:00'의 경우 표현식은 다음과 같습니다.

'2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00'

이건 항상false

이 문제를 해결하려면 update_date를 다음 주소로 캐스트합니다.date:

select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result

를 사용합니다.range사용자가 날짜를 입력한 경우:

select *
from table
where
    update_date
    <@
    tsrange('2013-05-03', '2013-05-03'::date + 1, '[)');

사용자가 타임스탬프를 입력했다면::date + 1일부

http://www.postgresql.org/docs/9.2/static/rangetypes.html

http://www.postgresql.org/docs/9.2/static/functions-range.html

날짜 변환을 사용하여 날짜 비교:시험:

select * from table 
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')

를 사용할 수도 있습니다.BETWEEN교환입니다.

다음은 간단한 예입니다.

SELECT
    customer_id,
    payment_id,
    amount,
    payment_date
FROM
    payment
WHERE
    payment_date BETWEEN '2007-02-07' AND '2007-02-15';

또한 다음 날짜 사이에 없는 모든 항목을 선택할 수도 있습니다.

SELECT
    customer_id,
    payment_id,
    amount,
    payment_date
FROM
    payment
WHERE
    payment_date NOT BETWEEN '2007-02-07' AND '2007-02-15';

다음은 일수에 따른 타임스탬프 델타를 포함하는 보다 상세한 예를 제시하겠습니다.

SELECT
    api_project.name,
    api_project.created,
    survey_response.created AS response_date,
    CASE
        WHEN survey_response.created
            BETWEEN api_project.created AND
                   (api_project.created + INTERVAL '180 days')
            THEN 'first_6_months'
        ELSE '6_months_after'
    END AS when_it_was_answered,
    EXTRACT(DAYS FROM survey_response.created - api_project.created)
      AS days_since_response
FROM
    bfb_survey_surveyresponseppent

언급URL : https://stackoverflow.com/questions/19469154/how-to-compare-dates-in-datetime-fields-in-postgresql

반응형