Postgresql 용 Datagrip을 사용하고 있습니다. 타임 스탬프 형식의 날짜 필드가있는 테이블이 (ex: 2016-11-01 00:00:00)
있습니다. 다음을 할 수 있기를 원합니다.
- 수학 연산자를 적용하여 1 일 빼기
- 오늘 -130 일의 기간을 기준으로 필터링
- 스탬프의 hh / mm / ss 부분없이 표시 (2016-10-31)
현재 시작 쿼리 :
select org_id, count(accounts) as count, ((date_at) - 1) as dateat
from sourcetable
where date_at <= now() - 130
group by org_id, dateat
((date_at)-1)
라인 1 의 조항은 다음과 같습니다.
오류 : 연산자가 없습니다. 시간대가없는 타임 스탬프-정수 힌트 : 지정된 이름 및 인수 유형과 일치하는 연산자가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수 있습니다. 69 회
이 now()
절은 유사한 메시지를 생성합니다.
오류 : 연산자가 없습니다. 시간대가있는 타임 스탬프-정수 힌트 : 지정된 이름 및 인수 유형과 일치하는 연산자가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수 있습니다. 위치 : …
유형 캐스트에 대한 온라인 가이드는 별 도움이되지 않습니다. 입력 부탁드립니다.
답변
INTERVAL
그것에 유형을 사용하십시오 . 예 :
--yesterday
SELECT NOW() - INTERVAL '1 DAY';
--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;
그런 다음 쿼리에서 다음을 수행 할 수 있습니다.
SELECT
org_id,
count(accounts) AS COUNT,
((date_at) - INTERVAL '1 DAY') AS dateat
FROM
sourcetable
WHERE
date_at <= now() - INTERVAL '130 DAYS'
GROUP BY
org_id,
dateat;
팁
팁 1
여러 피연산자를 추가 할 수 있습니다. 예 : 이번 달의 마지막 날을 얻는 방법?
SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';
팁 2
make_interval
함수를 사용하여 간격 을 만들 수도 있습니다. 런타임에 만들어야 할 때 유용합니다 (리터럴을 사용하지 않음).
SELECT make_interval(days => 10 + 2);
SELECT make_interval(days => 1, hours => 2);
SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);