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
'programing' 카테고리의 다른 글
| 어떻게 Bash에서 두 개의 파이프라인을 분리할 수 있죠? (0) | 2023.04.16 |
|---|---|
| 선택 쿼리에서 자동 증분 필드를 생성하는 방법 (0) | 2023.04.16 |
| 콜이 오브젝트를 1개만 반환하는 경우 Powershell이 어레이를 반환하도록 강제하려면 어떻게 해야 합니까? (0) | 2023.04.16 |
| 새로운 로컬 브랜치를 리모트 Git 저장소에 푸시하고 추적하려면 어떻게 해야 하나요? (0) | 2023.04.16 |
| Windows 레지스트리의 환경변수는 어디에 저장되어 있습니까? (0) | 2023.04.16 |