[sql] PostgreSQL에서 날짜 시간 필드의 날짜를 비교하는 방법은 무엇입니까?

postgresql (Windows 버전 9.2.4)의 날짜를 비교할 때 이상한 시나리오에 직면했습니다. 테이블에 ‘timestamp without timezone’유형의 update_date 열이 있습니다. 고객은 날짜 (예 : 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')


답변