본문 바로가기

MySql

[내일 배움 카드, 달리기 반] Lv2. 날짜 별 획득 포인트 조회하기

1. 문제

문제

 

 

 

 

2. 풀이

  • FROM → point_user 테이블
  • WHERE → X (필터링 조건이 없으므로)
  • GROUP BY → SUBSTR(created_at,1,10) created_at
  • HAVING → X (그룹이 없으므로)
  • SELECT → SUBSTR(created_at,1,10) created_at, ROUND(AVG(point)) average_points
  • ORDER BY → X (정렬 조건이 없으므로)
SELECT SUBSTR(created_at,1,10) created_at, 
       ROUND(AVG(point)) average_points
FROM point_users
GROUP BY 1
  • created_at 컬럼의 data_type인 TIMESTAMP에 대한 지식 부족으로 SUBSTR() 함수로 풀었다. MySQL은 자동 형 변환(TIMESTAMP 문자열)이 자동으로 되기 때문에 문제 푸는데에는 지장은 없다고 생각했다.
  • ROUND() 함수를 이용하여, 소수점 이하의 값을 반올림 할 수 있다.

 

 

 

3. 정답

SELECT 
    DATE(p.created_at) AS created_at,
    ROUND(AVG(p.point)) AS average_points
FROM 
    point_users p
GROUP BY 
    DATE(p.created_at);
  • DATE()는 TIMESTAMP나 DATETIME 형식의 데이터 값을 YYYY-MM-DD 형식의 DATE로 변환해준다.

 

 

 

 

4. DATE vs DATETIME vs TIMESTAMP

  1. DATE : 시간을 제외한 날짜를 저장하는 타입으로 기본 포맷은 'YYYY-MM-DD'이며, '1000-01-01'~'9999-12-31'까지 저장할 수 있다.
  2. DATETIME : 날짜와 시간을 함께 저장할 수 있는 타입으로, 기본 포맷은 'YYYY-MM-DD HH:mm:ss'이며, '1000-01-01 00:00:00'~'9999-12-31 23:59:59'까지 저장할 수 있다.
  3. TIMESTAMP : 날짜와 시간을 타임스태플 형식으로 저장하는 타입으로 '1970-01-01 00:00:01' UTC~'2038-01-19 03:14:07' UTC 까지의 범위를 저장할 수 있다. (1970~UTC 부터, 4Byte 정수를 사용하여 값을 저장하기 때문에 2038년 까지만 저장할 수 있다.)