[sql] 타임 스탬프 날짜에서 1 일 빼기

Postgresql 용 Datagrip을 사용하고 있습니다. 타임 스탬프 형식의 날짜 필드가있는 테이블이 (ex: 2016-11-01 00:00:00)있습니다. 다음을 할 수 있기를 원합니다.

  1. 수학 연산자를 적용하여 1 일 빼기
  2. 오늘 -130 일의 기간을 기준으로 필터링
  3. 스탬프의 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);

더 많은 정보:

날짜 / 시간 함수 및 연산자

datatype-datetime (특수 값) .


답변