[TIL] SQL - 데이터 변환

한울·2025년 12월 16일

1. Core Concept

1. 타입 변경 - CAST 함수

  • 특정 타입으로 변환한다.
    CAST(value AS datatype)
    cf) SAFE_CAST: 더 안전히 변환
  • 변환 실패 시 에러 대신 NULL을 반환한다.
    SAFE_CAST(value AS datatype)

2. 문자열 함수

  • CONCAT: 문자열 붙이기

    CONCAT(expression1, expression2, ...)
    SELECT CONCAT('I', ' ', 'love', ' ', 'data');
    -- 결과: I love data
  • SPLIT: 문자열 분리하기

     CAST(value AS datatype)
    SELECT SPLIT('seoul,busan,incheon', ',');
    -- 결과: ['seoul', 'busan', 'incheon']
  • REPLACE: 특정 문자열 수정하기

      CAST(value AS datatype)
    SELECT REPLACE('I like SQL', 'SQL', 'Python');
    -- 결과: I like Python
  • TRIM: 문자열의 앞 뒤 공백 제거

    TRIM(text)
    SELECT TRIM('   data   ');
    -- 결과: data
  • UPPER: 영어 대문자 변환

    UPPER(text)
    SELECT UPPER('bigquery');
    -- 결과: BIGQUERY

3. 날짜 및 시간 데이터

  • CURRENT_DATETIME : 현재 날짜와 시간을 반환한다.
    CURRENT_DATETIME()
  • EXTRACT : 날짜/시간 값에서 특정 단위(YEAR, MONTH, DAY, DAYOFWEEK 등)를 추출한다.
    EXTRACT(part FROM datetime_expression)
    SELECT EXTRACT(YEAR FROM CURRENT_DATETIME());
    SELECT EXTRACT(DAYOFWEEK FROM CURRENT_DATETIME());
  • DATETIME_TRUC: 날짜/시간을 지정한 단위 기준으로 버린다.
    DATETIME_TRUNC(datetime_expression, part)
    SELECT DATETIME_TRUNC(CURRENT_DATETIME(), DAY);
    -- 시·분·초를 00:00:00으로 초기화
  • PARSE_DATETIME: 문자열을 DATETIME 타입으로 변환한다.
    PARSE_DATETIME(format_string, datetime_string)
    SELECT PARSE_DATETIME('%Y-%m-%d %H:%M:%S', '2025-12-16 14:30:00');
  • FORMAT_DATETIME: DATETIME 타입을 문자열로 변환한다.
    FORMAT_DATETIME(format_string, datetime_expression)
    SELECT FORMAT_DATETIME('%Y-%m-%d', CURRENT_DATETIME());
  • DATETIME_DIFF : 두 DATETIME 타입 값의 차이를 지정한 단위로 계산한다.
    DATETIME_DIFF(datetime_expression1, datetime_expression2, part)
	SELECT DATETIME_DIFF(
  		DATETIME '2025-12-31 00:00:00',
  		DATETIME '2025-12-01 00:00:00',
  		DAY
	);
	-- 결과: 30

2. Key Examples

  • 각 트레이너별로 그들이 포켓몬을 포획한 첫 날을 찾고, 그 날짜를 'DD/MM/YYYY' 형식으로 출력
    SELECT 
      trainer_id,
      FORMAT_DATETIME('%d/%m/%Y', MIN(catch_date)) as date
    FROM
      basic.trainer_pokemon 
    GROUP BY
      trainer_id
    ORDER BY
      trainer_id
  • 배틀이 일어난 날짜를 기준으로, 요일별로 배틀이 얼마나 자주 일어났는지 계산
    SELECT
      EXTRACT(DAYOFWEEK FROM battle_date) as day,
      COUNT(*) as cnt
    FROM 
      basic.battle
    GROUP BY
      day
    ORDER BY 
      day

3. Confusing vs Clarified

오늘 강의를 듣기 전에는 DATETIMETIMESTAMP의 차이를 정확히 구분하지 못했었다.
시간을 해석하는 기준과 사용 목적이 다르다는 점에서 중요한 차이가 있었다.

  • DATETIME은 절대적인 날짜·시간 값을 그대로 저장하며, 타임존과 무관하게 입력한 값이 그대로 보존된다.
  • TIMESTAMP는 UTC 기준으로 저장되고, 조회 시 DB 혹은 세션의 타임존에 따라 자동으로 변환된다.

4. Analytical Insight

1. 데이터 타입 변환이 중요한 이유?

  • 눈으로 인지하는 타입과 실제 타입이 다를 수 있다.
    • 빈 값이 ""일 수도, NULL일 수도 있다.
    • '1'이 숫자일 수도, 문자일 수도 있다.
    • '2025-12-16'이 DATE 타입일 수도, 문자열 타입일 수도 있다.
  • 타입에 따라 적용되는 함수가 달라지기 때문에 올바른 타입으로 변환하는 게 중요하다.

2. 날짜 및 시간 데이터가 중요한 이유?

  • 전 세계 타임존이 달라서 “하루 경계”가 사람마다 다르다.
  • 시차는 단순히 "+9시간" 같은 고정 차이만 있는 게 아니라 어떤 지역은 서머타임으로 인해 계절에 따라 UTC 오프셋이 바뀐다.

5. Practice / Next Step

  • LeetCode에서 날짜/시간 변환 관련 SQL 문제 2~3개 풀어보기
  • EXTRACTDATETIME_TRUNC를 사용하는 문제 위주로 연습
profile
데이터 공부

0개의 댓글