티스토리 뷰
SQL DATE_SUB() 함수란?
DATE_SUB() 함수는 날짜 또는 날짜/시간 값에서 지정된 시간 간격을 빼는 데 사용됩니다.
이 기능은 과거 날짜 확인, 날짜 범위별 데이터 필터링 또는 날짜/시간 값 조작과 같은 날짜 계산에 필수적입니다.
기본 구문
DATE_SUB(date, INTERVAL value unit)
- date : 간격을 뺄 시작 날짜 또는 날짜/시간 값입니다.
- value : 뺄 단위 수(양의 정수일 수 있음).
- unit : 뺄 시간 단위(예: DAY, MONTH, YEAR, HOUR).
사용 예시
1. 날짜에서 일 빼기
- 날짜에서 일수를 빼려면 'DAY'를 단위로 사용하세요.
SELECT DATE_SUB('2024-11-08', INTERVAL 15 DAY) AS new_date;
결과: 2024-10-24
'2024-11-08'에서 15일을 빼면 '2024-10-24'가 됩니다.
2. 날짜에서 월 빼기
- 월을 빼려면 'MONTH'를 단위로 사용하세요.
SELECT DATE_SUB('2024-11-08', INTERVAL 2 MONTH) AS new_date;
결과: 2024-09-08
여기서는 '2024-11-08'에서 2개월을 빼서 '2024-09-08'을 얻습니다.
3. 날짜에서 연도 빼기
- 연도를 빼려면 'YEAR'를 단위로 사용하세요.
SELECT DATE_SUB('2024-11-08', INTERVAL 1 YEAR) AS new_date;
결과: 2023-11-08
이 경우 '2024-11-08'에서 1년을 빼면 '2023-11-08'이 됩니다.
4. 날짜/시간에서 시간 빼기
- 'DATETIME'에서 시간을 빼려면 단위로 'HOUR'를 사용하세요.
SELECT DATE_SUB('2024-11-08 15:30:00', INTERVAL 5 HOUR) AS new_datetime;
결과: 2024-11-08 10:30:00
여기서는 '2024-11-08 15:30:00''에서 5시간을 빼서 '2024-11-08 10:30:00''이 됩니다.
5. WHERE 절에서 DATE_SUB() 사용
- DATE_SUB()은 날짜 조건에 따라 레코드를 필터링하는 데 자주 사용됩니다.
- 예를 들어 지난 30일 동안의 모든 레코드를 검색하려면 다음을 수행하세요.
SELECT * FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
- CURDATE()는 현재 날짜(시간 제외)를 반환합니다.
- DATE_SUB(CURDATE(), INTERVAL 30 DAY)는 30일 전 날짜를 제공합니다.
- 쿼리는 지난 30일 동안 이루어진 모든 주문을 검색합니다.
GOOD 사용법
1. 특정 날짜 범위에 대한 데이터 필터링
- DATE_SUB()를 사용하면 지난 6개월 동안 구매하지 않은 고객을 찾는 등 특정 기간 내의 데이터를 찾을 수 있습니다.
SELECT * FROM customers
WHERE last_purchase_date < DATE_SUB(CURDATE(), INTERVAL 6 MONTH);
- 이 쿼리는 지난 6개월 동안 구매를 하지 않은 고객을 검색합니다.
2. 보고서의 과거 날짜 계산
- 보고서의 날짜(예: 90일 전)를 계산해야 하는 경우 DATE_SUB()를 사용하면 다음과 같이 쉽게 할 수 있습니다.
SELECT * FROM sales
WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 90 DAY);
- 지난 90일 동안 발생한 모든 판매가 반환됩니다.
BAD 사용법
1. 잘못된 날짜 형식 사용
SELECT DATE_SUB('2024-13-08', INTERVAL 5 DAY);
- '2024-13-08' 날짜는 13번째 달이 없기 때문에 유효하지 않습니다. 항상 날짜 형식이 올바른지 확인하십시오.
2. 날짜 값 대신 문자열 리터럴 사용
SELECT DATE_SUB('2024-11-08', INTERVAL 10 DAY);
- DATE_SUB() 함수에서 직접 문자열 리터럴을 사용하면 문제가 발생할 수 있습니다. 특히 데이터베이스가 암시적으로 문자열을 날짜로 변환하지 않는 경우 더욱 그렇습니다. 가능하면 날짜 열을 사용하는 것이 더 안전합니다.
3. 비합리적으로 큰 간격 빼기
SELECT DATE_SUB('2024-11-08', INTERVAL 10000 DAY);
- 지나치게 큰 값(예: 10,000일)을 빼면 날짜가 비현실적이거나 유효하지 않을 수 있습니다.
반응형