IT

Oracle에서 날짜 부분만을 기준으로 두 DATE 값을 비교하는 방법은 무엇입니까?

itgroup 2023. 9. 10. 12:10
반응형

Oracle에서 날짜 부분만을 기준으로 두 DATE 값을 비교하는 방법은 무엇입니까?

다음 쿼리로 지난 30일 동안의 카운트를 파악하려고 합니다.

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.

기본적으로 나의 쿼리에서 나는 조건에서 날짜 부분만 비교하려고 합니다.date_occured >= (CURRENT_DATE - 30), 시간도 비교가 되는 것 같아요.

다음과 같이 TRUNK를 시도했습니다.

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)

그러나 쿼리를 실행하면 반환되지 않습니다.

저도 노력했습니다.

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);

다시는 돌아오지 않습니다.

Oracle에서 두 DATE 값 중 날짜 부분만 비교하려면 어떻게 해야 합니까?

이 조건에서는 오른쪽만 잘라내면 됩니다.

WHERE date_occured >= TRUNC(CURRENT_DATE - 30)

그 이유는 TRUNC(DATE_occured)가 TRUNC(CURRENT_DATE - 30)보다 늦으면 TRUNC(DATE_occured) 이후의 임의의 시점도 TRUNC(CURRENT_DATE - 30)보다 늦어질 수밖에 없기 때문입니다.

date_graphics >= TRUNK(date_occured) (생각해 보세요) 라는 것은 분명히 항상 사실입니다.

논리는 A >= B, B >= C이면 A >= C를 따른다고 합니다.

이제 대체할 수:

  • A : date_occured
  • B : TRUNK(date_occured)
  • C : TRUNK (CURRENT_DATE - 30)

선택한 부분도 잘라내야 할 것 같습니다.

 SELECT TRUNC(date_occured) AS short_date_occured, COUNT(*)
 FROM problem 
 WHERE date_occured >= trunc(SYSDATE- 30) 
 GROUP BY short_date_occured;

SYSDATE vs CURRENT_DATE를 사용해 보십시오.SysDate는 서버의 로컬 시간을 사용하며, CURRENT_DATE는 클라이언트 연결의 로컬 시간에 있는 서버의 현재 날짜/시간을 반환합니다.

나는 토니가 옳다는 것과 당신이 정말로 원하는 것을 의심하는 경향이 있습니다.TRUNC그 표현의 우변

당신이 원한다면,TRUNC식의 양쪽 모두에서 성능 문제가 발생하므로 함수 기반 인덱스가 필요할 수 있습니다.

CREATE INDEX idx_problem_trunc_dt_occured
    ON problem( trunc( date_occurred ) );

그러면 원래 쿼리에서 함수 기반 인덱스를 사용할 수 있습니다.

지수 친화적 접근법은 다음과 같습니다.

Oracle Native MONTH_BETWEEN 함수를 사용하는 경우 열에 함수를 사용할 필요가 없습니다.

개월 수에 따라 차이를 반환합니다.요일 또한 차이로 주어지지만 정밀도 면에서 BETWEEN 절을 사용하는 것을 선호했습니다.

WHERE MONTHS_BETWEEN(date_occured, CURRENT_DATE - 30) BETWEEN 0 AND 1

언급URL : https://stackoverflow.com/questions/7433363/how-to-compare-two-date-values-based-only-on-date-part-in-oracle

반응형