ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DAYOFWEEK 함수
    Programing Language/SQL 2025. 6. 14. 11:11
    반응형

    기본 문법

     
    sql
    DAYOFWEEK(date)

    반환값

     
    1 = 일요일 (Sunday)
    2 = 월요일 (Monday) 
    3 = 화요일 (Tuesday)
    4 = 수요일 (Wednesday)
    5 = 목요일 (Thursday)
    6 = 금요일 (Friday)
    7 = 토요일 (Saturday)

    🔍 기본 사용 예시

     
    sql
    -- 오늘이 무슨 요일인지
    SELECT DAYOFWEEK(CURDATE());  -- 오늘이 토요일이면 7 반환
    
    -- 특정 날짜의 요일
    SELECT DAYOFWEEK('2025-06-14');  -- 7 (토요일)
    
    -- 주문 데이터의 요일 확인
    SELECT order_id, order_date, DAYOFWEEK(order_date) as day_num
    FROM orders;

    🎯 실무 활용 예시

    1. 요일별 매출 분석

     
    sql
    SELECT 
        CASE DAYOFWEEK(order_date)
            WHEN 1 THEN '일요일'
            WHEN 2 THEN '월요일'
            WHEN 3 THEN '화요일'
            WHEN 4 THEN '수요일'
            WHEN 5 THEN '목요일'
            WHEN 6 THEN '금요일'
            WHEN 7 THEN '토요일'
        END AS weekday,
        COUNT(*) AS order_count,
        SUM(amount) AS total_sales
    FROM orders
    GROUP BY DAYOFWEEK(order_date)
    ORDER BY DAYOFWEEK(order_date);

    2. 주말/평일 구분

     
    sql
    -- 주말 주문만 조회
    SELECT *
    FROM orders
    WHERE DAYOFWEEK(order_date) IN (1, 7);  -- 일요일, 토요일
    
    -- 평일 주문만 조회  
    SELECT *
    FROM orders
    WHERE DAYOFWEEK(order_date) BETWEEN 2 AND 6;  -- 월~금
    
    -- 주말/평일 구분하여 집계
    SELECT 
        CASE 
            WHEN DAYOFWEEK(order_date) IN (1, 7) THEN '주말'
            ELSE '평일'
        END AS day_type,
        COUNT(*) AS order_count,
        AVG(amount) AS avg_amount
    FROM orders
    GROUP BY 
        CASE 
            WHEN DAYOFWEEK(order_date) IN (1, 7) THEN '주말'
            ELSE '평일'
        END;

    3. 요일별 고객 행동 분석

     
    sql
    -- 월요일에 가장 많이 주문하는 고객들
    SELECT customer_id, COUNT(*) as monday_orders
    FROM orders
    WHERE DAYOFWEEK(order_date) = 2  -- 월요일
    GROUP BY customer_id
    HAVING COUNT(*) >= 5
    ORDER BY monday_orders DESC;

    🔄 다른 요일 함수와 비교

    WEEKDAY vs DAYOFWEEK

     
    sql
    -- WEEKDAY: 0=월요일, 1=화요일, ..., 6=일요일
    SELECT WEEKDAY('2025-06-14');    -- 5 (토요일)
    
    -- DAYOFWEEK: 1=일요일, 2=월요일, ..., 7=토요일  
    SELECT DAYOFWEEK('2025-06-14');  -- 7 (토요일)
    
    -- 변환 공식
    SELECT 
        DAYOFWEEK('2025-06-14') as dayofweek_result,    -- 7
        WEEKDAY('2025-06-14') as weekday_result,        -- 5
        ((DAYOFWEEK('2025-06-14') + 5) % 7) as converted; -- DAYOFWEEK를 WEEKDAY로 변환

    DAYNAME 함수

     
    sql
    -- 요일 이름 직접 반환 (영어)
    SELECT DAYNAME('2025-06-14');  -- 'Saturday'
    
    -- 한국어로 변환
    SELECT 
        CASE DAYNAME('2025-06-14')
            WHEN 'Sunday' THEN '일요일'
            WHEN 'Monday' THEN '월요일'
            WHEN 'Tuesday' THEN '화요일'
            WHEN 'Wednesday' THEN '수요일'
            WHEN 'Thursday' THEN '목요일'
            WHEN 'Friday' THEN '금요일'
            WHEN 'Saturday' THEN '토요일'
        END AS korean_dayname;

    🎯 코딩테스트 출제 패턴

    1. 요일별 주문 통계

     
    sql
    -- "각 요일별 평균 주문 금액을 구하시오"
    SELECT 
        DAYOFWEEK(order_date) as day_num,
        CASE DAYOFWEEK(order_date)
            WHEN 1 THEN '일요일'
            WHEN 2 THEN '월요일'
            WHEN 3 THEN '화요일'
            WHEN 4 THEN '수요일'
            WHEN 5 THEN '목요일'
            WHEN 6 THEN '금요일'
            WHEN 7 THEN '토요일'
        END AS weekday,
        ROUND(AVG(amount), 2) as avg_amount
    FROM orders
    GROUP BY DAYOFWEEK(order_date)
    ORDER BY day_num;

    2. 특정 요일 필터링

     
    sql
    -- "월요일에 주문한 고객 목록"
    SELECT DISTINCT customer_id, customer_name
    FROM orders o
    JOIN customers c ON o.customer_id = c.id
    WHERE DAYOFWEEK(o.order_date) = 2;

    3. 주말 vs 평일 비교

     
    sql
    -- "주말과 평일의 평균 주문량 비교"
    SELECT 
        CASE 
            WHEN DAYOFWEEK(order_date) IN (1, 7) THEN '주말'
            ELSE '평일'
        END AS period_type,
        COUNT(*) as total_orders,
        AVG(amount) as avg_order_amount,
        SUM(amount) as total_revenue
    FROM orders
    GROUP BY 
        CASE 
            WHEN DAYOFWEEK(order_date) IN (1, 7) THEN '주말'
            ELSE '평일'
        END;

    💡 성능 최적화 팁

    ❌ 비효율적인 사용

     
    sql
    -- 인덱스를 탈 수 없음
    WHERE DAYOFWEEK(order_date) = 2

    ✅ 효율적인 사용 (특정 날짜 범위가 있을 때)

     
    sql
    -- 먼저 날짜 범위로 필터링 후 요일 확인
    WHERE order_date >= '2025-06-01' 
      AND order_date < '2025-07-01'
      AND DAYOFWEEK(order_date) = 2

    🔍 실제 활용 시나리오

    배송 스케줄링

     
    sql
    -- 월요일 배송 불가 상품들
    SELECT product_id, order_date
    FROM orders
    WHERE DAYOFWEEK(expected_delivery_date) = 2  -- 월요일
      AND shipping_type = 'special';

    고객 행동 패턴 분석

     
    sql
    -- 요일별 접속자 수 (웹 로그 분석)
    SELECT 
        DAYOFWEEK(access_date) as day_num,
        COUNT(DISTINCT user_id) as unique_visitors,
        COUNT(*) as page_views
    FROM web_logs
    WHERE access_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
    GROUP BY DAYOFWEEK(access_date)
    ORDER BY day_num;

    핵심 요약: DAYOFWEEK는 요일별 데이터 분석에 필수적인 함수로, 특히 비즈니스 패턴 분석에서 자주 활용됩니다! 🎯

    반응형

    댓글

Designed by Tistory.