0Pricing
SQL Interview Prep · 강의

날짜 연산과 간격

기간을 더하고 빼며 날짜 사이의 차이를 계산합니다.

날짜 연산과 간격은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

면접에서 날짜 계산이 자주 등장하는 이유

날짜 계산은 가장 실용적인 SQL 기술 중 하나이므로, 면접관은 분석가 및 백엔드 직무에서 이를 집중적으로 질문합니다. 거의 모든 비즈니스 질문에는 시간 요소가 있습니다. 최근 30일, 주별 주문 수, 가입 후 경과 일수 등이 그 예입니다.

문제는 날짜 함수가 SQL에서 표준화가 가장 덜 된 부분이라는 점입니다. 같은 작업도 PostgreSQL, MySQL, SQL 서버에서 문법이 다릅니다. 역량이 뛰어난 지원자는 먼저 개념을 명확하게 설명한 다음, 해당 방언에 맞게 문법을 조정합니다.

  • 기간 더하기 또는 빼기
  • 두 날짜 사이의 차이 계산하기
  • INTERVAL 값 사용하기

INTERVAL 형식

PostgreSQL과 SQL 표준에서 기간은 기간이라는 1급 값이며, 이를 interval이라고 합니다. 일반적인 + 및 - 연산자로 날짜나 타임스탬프에 더할 수 있습니다.

이는 “30일 전”이나 “지금부터 3개월 후”를 표현하는 가장 깔끔한 방법이며, 영어 문장처럼 읽히기 때문에 면접관들이 특히 좋아합니다.

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

방언별 기간 더하기

면접관은 흔히 다음과 같이 질문합니다. “MySQL과 SQL 서버에서 7일을 더하려면 어떻게 하겠습니까?” 주요 세 SQL 방언을 알고 있으면 실제 경험이 있다는 신호가 됩니다.

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL 서버: DATEADD(day, 7, d)

개념은 동일하고 표기만 다릅니다. 항상 작성 중인 방언을 명시하십시오.

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

두 날짜 사이의 차이

날짜 계산의 다른 한쪽은 두 날짜가 얼마나 떨어져 있는지 계산하는 것입니다. 결과는 단위와 방언에 따라 달라집니다.

PostgreSQL에서는 두 date 값의 차를 구하면 정수 형태의 일수가 바로 반환됩니다. 반면 두 timestamp 값의 차를 구하면 기간이 반환됩니다.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF와 그 함정

DATEDIFF는 MySQL과 SQL 서버에 존재하지만 동작이 서로 다릅니다. 이는 면접에서 자주 나오는 함정입니다.

  • MySQL: DATEDIFF(end, start)는 온전한 일 단위만 반환합니다.
  • SQL 서버: DATEDIFF(unit, start, end)는 단위를 받고, 온전한 단위가 아니라 경계 통과 횟수를 셉니다.

이러한 경계 동작이 중요한 이유는 다음과 같습니다. SQL 서버에서 DATEDIFF(year, '2023-12-31', '2024-01-01')는 실제로 하루만 지났더라도 1을 반환합니다.

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

나이를 연 단위로 올바르게 계산하기

“고객의 나이를 연 단위로 계산하십시오”는 고전적인 문제입니다. 윤년 때문에 단순히 일수 차이를 365로 나누면 오차가 누적됩니다. PostgreSQL에는 실제 달력상의 기간을 반환하는 AGE()가 있습니다.

정확한 정수 연수만 구하려면 나이에서 연도 부분을 추출하십시오.

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

실습 예제: 최근 30일 동안의 주문

거의 모든 면접에서 등장하는 필터 조건입니다. 올바른 방법은 열을 함수로 감싸는 것이 아니라, 계산한 기준일과 날짜 열을 비교하는 것입니다.

order_date를 고정된 기준일과 비교하면 order_date의 인덱스를 계속 사용할 수 있습니다. 이 인덱스 관련 내용은 뒤에서 다시 다룹니다.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

달력상의 한 달에 사용하는 반열린 범위

“2024년 3월의 모든 주문”을 요청받았을 때 타임스탬프 열에 BETWEEN '2024-03-01' AND '2024-03-31'을 사용하지 마십시오. 그러면 3월 31일 오후 11시의 행을 놓치며, 경계값 오류가 발생하기 쉽습니다.

견고한 패턴은 반열린 범위입니다. 시작 값 이상(>=)이고 다음 달의 시작 값 미만(<)으로 지정합니다. 이 방식은 열의 정밀도가 어떻든 작동합니다.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT 및 날짜 부분

날짜에서 단일 구성 요소를 추출하는 일은 보고 업무에서 흔히 수행합니다. 표준 함수는 EXTRACT(part FROM d)이며, PostgreSQL과 MySQL에서 지원됩니다.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • 요일에는 EXTRACT(DOW FROM d)를 사용합니다.
  • SQL 서버에서는 대신 DATEPART(weekday, d)를 사용합니다.

주의하십시오. MONTH만 추출하면 서로 다른 연도의 3월이 함께 그룹화되며, 이는 원하는 결과인 경우가 드뭅니다.

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

심화 예제: 다음 생일까지 남은 일수

추출과 덧셈을 결합한 더 어려운 계산 문제입니다. 태어난 월과 일로 올해의 생일을 만들고, 생일이 이미 지났다면 다음 연도로 넘깁니다.

이 과정을 소리 내어 설명하면, 올해 생일이 이미 지난 경우와 같은 경계 사례를 추론할 수 있다는 점을 면접관에게 보여 줄 수 있습니다.

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

해당 월의 첫날과 마지막 날

“각 주문이 속한 달의 마지막 날을 구하십시오”라는 문제는 내장 기능을 사용할지 직접 다시 구현할지를 확인합니다. PostgreSQL에서는 DATE_TRUNC과 기간 계산을 조합하고, MySQL에는 LAST_DAY()가 바로 제공됩니다.

PostgreSQL에서 마지막 날을 구하는 요령은 월의 시작일로 자르고, 한 달을 더한 다음, 하루를 빼는 것입니다.

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

빠른 확인

방언에 따른 날짜 차이 동작을 이해했는지 테스트해 보십시오.

요약: 날짜 계산 및 기간

면접을 위한 핵심 요점은 다음과 같습니다.

  • PostgreSQL에서는 INTERVAL 값과 +/-를 사용하고, MySQL에서는 DATE_ADD/DATEDIFF, SQL 서버에서는 DATEADD/DATEDIFF를 사용합니다.
  • SQL 서버의 DATEDIFF는 경과한 단위가 아니라 경계 통과 횟수를 셉니다. 이것이 가장 중요한 함정입니다.
  • 나이를 연 단위로 계산할 때는 일수를 365로 나누지 말고 AGE()에서 추출하십시오.
  • 최근 행은 열과 계산한 기준일을 비교해 필터링하고, 월 범위에는 반열린 범위(>= start AND < next)를 사용하십시오.

먼저 개념을 설명한 다음 방언에 맞게 조정하십시오.

자주 묻는 질문

“날짜 연산과 간격” 강의는 무료인가요?

네 — “날짜 연산과 간격” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“날짜 연산과 간격”에서 뭘 배우나요?

기간을 더하고 빼며 날짜 사이의 차이를 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“날짜 연산과 간격” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 날짜 연산과 간격
  2. 날짜 자르기와 구간화
  3. 문자열 파싱과 서식 지정
  4. 시간대와 타임스탬프
← SQL Interview Prep(으)로 돌아가기