Categories: SQL

SQL에서 날짜와 시간 다루기 (NOW, DATE_FORMAT, TIMESTAMP 등)

안녕하세요, 여러분! 데이터베이스 다루다 보면 날짜랑 시간 때문에 골치 아픈 적 많으시죠? 저도 그랬어요. 그래서 오늘은 SQL에서 날짜와 시간 다루는 꿀팁들을 같이 나눠보려고 해요. 특히 NOW 함수 활용법부터 DATE_FORMAT 함수로 원하는 형식 만드는 방법, 그리고 TIMESTAMP 데이터 유형 제대로 이해하는 법까지! 실제 쿼리 예시들을 통해서 바로바로 적용해볼 수 있도록 준비했답니다. 궁금하시죠? 같이 한번 알아볼까요?

 

 

NOW 함수 활용법

자, 이제 SQL의 꽃이라 할 수 있는 NOW() 함수에 대해 알아볼까요? 데이터베이스를 다루다 보면 “지금 당장!”의 시간 정보가 필요한 순간들이 정말 많아요. 예를 들어 회원 가입 시간, 게시글 작성 시간, 상품 주문 시간 등등… 쉴 새 없이 변화하는 정보들을 기록하려면 NOW() 함수가 필수죠! 마치 시계처럼 째깍째깍 현재 시간을 탁! 하고 찍어주는 마법같은 함수랍니다. ✨

NOW() 함수란?

NOW() 함수는 말 그대로 현재 날짜와 시간을 반환하는 함수예요. MySQL을 기준으로 YYYY-MM-DD HH:MM:SS 형식으로 결과값을 보여주는데요, 이게 무슨 말이냐면 2024년 1월 1일 오후 3시 15분 30초라면 2024-01-01 15:15:30 이렇게 표시된다는 거죠! 참 쉽죠? 😊

NOW() 함수 활용 예시: 회원 가입

자, 그럼 이 NOW() 함수를 어떻게 활용할 수 있을지 좀 더 자세히 살펴볼까요? 🤔 회원 가입 테이블을 예로 들어볼게요. users라는 테이블에 reg_date라는 컬럼이 있다고 가정해 봅시다. 이 컬럼에 회원 가입 시간을 기록하고 싶다면, SQL 쿼리를 다음과 같이 작성할 수 있어요.

INSERT INTO users (username, email, reg_date) VALUES ('newbie', 'newbie@example.com', NOW());

이 쿼리를 실행하면 newbie라는 사용자가 지금 바로 가입한 것처럼 reg_date 컬럼에 현재 시간이 뿅! 하고 기록된답니다. 마치 타임머신 같죠? 🕰️

NOW() 함수는 단순히 회원 가입뿐 아니라 게시글 작성, 상품 주문, 로그 기록 등 다양한 상황에서 활용될 수 있어요. 데이터베이스에 시간 정보를 기록하는 가장 기본적이고 필수적인 함수라고 할 수 있죠! 👍

CURDATE() 함수와 CURTIME() 함수

그런데, 가끔씩 “현재 날짜만 필요한데?” 또는 “현재 시간만 필요한데?” 싶을 때가 있지 않나요? 걱정 마세요! NOW() 함수와 함께 CURDATE() 함수와 CURTIME() 함수를 사용하면 된답니다. CURDATE() 함수는 현재 날짜를 YYYY-MM-DD 형식으로 반환하고, CURTIME() 함수는 현재 시간을 HH:MM:SS 형식으로 반환해요. 참 똑똑한 함수들이죠? 😉

CURDATE() 함수 활용 예시: 게시글 작성

예를 들어 게시글 테이블에 작성 날짜만 기록하고 싶다면 다음과 같이 쿼리를 작성할 수 있어요.

INSERT INTO posts (title, content, created_date) VALUES ('제목입니다', '내용입니다', CURDATE());

이렇게 하면 created_date 컬럼에는 날짜 정보만 깔끔하게 저장된답니다. 😄 CURTIME() 함수도 마찬가지로 사용할 수 있어요. 특정 이벤트 발생 시간만 기록하고 싶다면 CURTIME() 함수를 활용해 보세요!

마무리

NOW() 함수는 데이터베이스에서 시간 정보를 다루는 데 있어서 가장 기본적이면서도 중요한 함수예요. 이 함수 하나만 잘 알아두어도 데이터 관리가 훨씬 수월해진답니다. 다음에는 NOW() 함수와 찰떡궁합인 DATE_FORMAT 함수에 대해 알아볼 거예요. NOW() 함수로 얻은 시간 정보를 원하는 형식으로 변환하는 마법같은 함수랍니다. 기대해 주세요! ✨ 그럼 다음에 또 만나요! 👋

 

DATE_FORMAT 함수로 원하는 형식 만들기

후~ 드디어! NOW 함수를 익히셨으니 이제 날짜와 시간 데이터를 내 마음대로~ 주무를 수 있는 마법 같은 함수, DATE_FORMAT에 대해 알아볼 시간이에요! 마치 요리 재료를 다듬듯이 말이죠. NOW 함수가 싱싱한 재료를 가져다준다면, DATE_FORMAT은 그 재료를 먹음직스럽게 요리하는 셰프라고 할 수 있겠네요! ^^

자, 데이터베이스에 저장된 날짜와 시간 정보, 그냥 밋밋하게 보여주기엔 너무 아깝잖아요? 2023-12-25 14:30:00 이렇게 보이는 것보다 2023년 12월 25일 오후 2시 30분처럼 예쁘게 보여주면 얼마나 좋을까요? 바로 이럴 때 DATE_FORMAT 함수가 빛을 발한답니다! ✨

DATE_FORMAT 함수는 기본적으로 두 가지 인자를 받아요. 첫 번째는 변환할 날짜 또는 시간 데이터이고, 두 번째는 원하는 형식을 지정하는 포맷 문자열이에요. 포맷 문자열은 마치 암호처럼 보일 수 있지만, 걱정 마세요! 하나씩 뜯어보면 아주 간단하답니다.

주요 포맷 문자열

자, 가장 많이 사용하는 포맷 문자열 몇 가지를 예시와 함께 살펴볼까요?

  • %Y: 4자리 연도 (e.g., 2023) – 2023년처럼 말이죠!
  • %y: 2자리 연도 (e.g., 23) – 요즘은 잘 안 쓰지만, 레트로 감성을 원한다면…?
  • %m: 월 (e.g., 01, 12) – 0이 붙는 형태라는 거, 잊지 마세요~
  • %c: 월 (e.g., 1, 12) – 0 없이 깔끔하게!
  • %d: 일 (e.g., 01, 31) – 역시 0이 붙을 수 있어요.
  • %e: 일 (e.g., 1, 31) – 0 없이 심플하게!
  • %H: 24시간 형식의 시 (e.g., 00, 23) – 밤 10시는 22시!
  • %h 또는 %I: 12시간 형식의 시 (e.g., 01, 12) – 오전/오후를 구분해야겠죠?
  • %i: 분 (e.g., 00, 59) – 시간과 헷갈리지 않도록 조심!
  • %s: 초 (e.g., 00, 59) – 시간의 기본 단위!
  • %p: 오전/오후 (e.g., AM, PM) – 12시간 형식과 함께 사용하면 찰떡궁합!
  • %W: 요일 이름 (e.g., Sunday, Monday) – 영어로 표시돼요!
  • %a: 요일 이름 (e.g., Sun, Mon) – 짧게 줄여서!
  • %M: 월 이름 (e.g., January, December) – 영어로 표시됩니다.
  • %b: 월 이름 (e.g., Jan, Dec) – 짧게 줄여서!

포맷 문자열 조합하기

자, 이제 이 포맷 문자열들을 조합해서 원하는 형식을 만들 수 있어요. 예를 들어, “2023년 12월 25일 월요일 오후 2시 30분 00초”라는 형식을 만들고 싶다면 %Y년 %m월 %d일 %W %p %h시 %i분 %s초처럼 포맷 문자열을 조합하면 된답니다. 참 쉽죠? 😊

물론 이것 외에도 다양한 포맷 문자열이 존재해요. MySQL 공식 문서를 참고하면 더욱 자세한 정보를 얻을 수 있으니, 궁금하시다면 꼭 한번 확인해 보세요! (강력 추천!) 다양한 조합을 시도해 보면서 나만의 포맷을 만들어 보는 것도 재미있을 거예요! 😄

DATE_FORMAT 활용법

DATE_FORMAT 함수는 단순히 날짜와 시간을 보기 좋게 표시하는 것뿐만 아니라 데이터 분석에도 유용하게 활용될 수 있어요. 특정 기간의 데이터를 추출하거나, 시간대별 데이터 변화를 분석하는 등 다양한 활용법이 있죠. 예를 들어, %Y-%m 형식을 사용하면 특정 월의 데이터만 뽑아낼 수 있겠죠? 이처럼 DATE_FORMAT 함수는 SQL 쿼리를 작성할 때 정말 강력한 도구가 될 수 있답니다. 마치 만능 칼처럼 말이죠! ⚔️

DATE_FORMAT 함수, 어렵게 생각하지 마시고 직접 쿼리를 작성해보면서 익숙해지는 것이 가장 중요해요! 처음에는 복잡해 보일 수 있지만, 몇 번 연습하다 보면 금방 손에 익을 거예요. 그리고 혹시 쿼리 작성 중 막히는 부분이 있다면 언제든지 질문해 주세요! 함께 고민하고 해결해 나갈 수 있도록 도와드릴게요! 😉 다음에는 TIMESTAMP 데이터 유형에 대해 알아보도록 하겠습니다. 기대해주세요!

 

TIMESTAMP 데이터 유형 이해하기

자, 이제 슬슬 SQL에서 날짜와 시간을 다루는 데 있어서 아주 중요한, TIMESTAMP 데이터 유형에 대해 깊이 파고들어 볼까요~? DATE 타입과 비슷해 보이지만, 숨겨진 매력이 엄청나답니다! 😄

TIMESTAMP의 특징

TIMESTAMP는 DATE 친구와 달리 날짜 정보뿐만 아니라 시간 정보까지 함께 저장해준다는 큰 장점이 있어요. 1970년 1월 1일 00:00:00 UTC를 기준으로 몇 초가 지났는지를 저장하는 방식이죠. 😮 ‘UTC’라는 단어가 좀 낯설 수도 있겠네요. Coordinated Universal Time, 즉 협정 세계시를 의미하는데, 세계 표준시라고 생각하면 쉽답니다. 😉

Epoch Time

그런데 왜 하필 1970년 1월 1일일까요? 궁금하시죠?! 이 날짜는 유닉스 시간의 시작점, Epoch Time으로, 컴퓨터 시스템에서 시간을 표현하는 기준점으로 많이 사용되고 있어요. 그래서 TIMESTAMP도 이 기준을 따르고 있는 거랍니다. 뭔가 역사적인 느낌이 들지 않나요? 🤔

TIMESTAMP의 시간 범위

자, 그럼 TIMESTAMP가 저장할 수 있는 시간 범위는 어떻게 될까요? 바로 ‘1970년 1월 1일 00:00:01 UTC’부터 ‘2038년 1월 19일 03:14:07 UTC’까지랍니다! “어? 2038년까지만?!” 하고 놀라셨을 수도 있겠네요. 이건 32비트 시스템에서 정수를 표현하는 방식 때문에 발생하는 한계인데요, 64비트 시스템에서는 훨씬 더 넓은 범위의 시간을 다룰 수 있으니 너무 걱정하지 마세요! 😊

TIMESTAMP의 활용

TIMESTAMP 데이터 유형을 사용하면 ‘2023-10-27 10:30:00’과 같이 날짜와 시간을 함께 저장할 수 있어요. 초 단위의 정밀도를 제공하기 때문에 아주 정확한 시간 기록이 필요한 경우에 유용하죠. 예를 들어, 웹사이트 로그 분석, 주식 거래 기록, 과학 실험 데이터 저장 등 아주 다양한 분야에서 활용될 수 있답니다. 정말 놀랍지 않나요?! 🤩

TIMESTAMP와 DATETIME의 차이점

DATETIME 데이터 유형과 비슷해 보이지만, TIMESTAMP는 시간대를 고려한다는 중요한 차이점이 있어요. DATETIME은 입력된 값 그대로 저장하지만, TIMESTAMP는 서버의 시간대로 변환하여 저장하고, 검색할 때는 다시 사용자의 시간대로 변환하여 보여준답니다. 이렇게 시간대를 자동으로 변환해주니, 전 세계 사용자를 대상으로 하는 서비스를 개발할 때 특히 유용하겠죠~? 글로벌 시대에 딱 맞는 데이터 유형이라고 할 수 있어요! 👍

TIMESTAMP의 장점

자, 그럼 TIMESTAMP의 장점을 좀 더 자세히 살펴볼까요? 데이터의 무결성을 보장하고 시간대 변환을 자동으로 처리해준다는 점 외에도, 저장 공간을 효율적으로 사용할 수 있다는 장점도 있어요. DATETIME보다 저장 공간을 적게 차지하기 때문에 데이터베이스 성능 향상에도 도움이 된답니다. 작은 차이 같지만, 대용량 데이터를 다룰 때는 엄청난 차이를 만들어낼 수 있어요! 💯

자동 업데이트 기능

TIMESTAMP는 데이터 변경 시 자동으로 업데이트되는 기능도 제공해요. ON UPDATE CURRENT_TIMESTAMP 옵션을 사용하면 데이터가 수정될 때마다 TIMESTAMP 값이 현재 시간으로 자동 업데이트되죠. 데이터가 언제 수정되었는지 따로 기록할 필요가 없어서 정말 편리하답니다! 😉

TIMESTAMP의 단점

하지만, TIMESTAMP에도 작은 단점이 있어요. 바로 앞서 말씀드렸던 2038년 문제죠. 하지만 이 문제는 64비트 시스템을 사용하면 해결되니 너무 걱정하지 않아도 된답니다! 그리고 시간대 변환 기능이 때로는 불필요할 수도 있어요. 이럴 때는 DATETIME을 사용하는 것이 더 효율적일 수 있죠. 상황에 맞게 적절한 데이터 유형을 선택하는 것이 중요해요! 👌

결론

이처럼 TIMESTAMP 데이터 유형은 날짜와 시간 정보를 정확하고 효율적으로 관리하는 데 아주 유용한 도구랍니다. 다음에는 실제 활용 예시와 쿼리 작성을 통해 TIMESTAMP를 어떻게 활용할 수 있는지 더 자세히 알아볼게요! 기대해주세요~ 🤗

 

실제 활용 예시와 쿼리 작성

자, 이제까지 NOW(), DATE_FORMAT(), TIMESTAMP에 대해 알아봤으니~ 실제로 어떻게 활용할 수 있는지 궁금하시죠? 데이터베이스에서 날짜와 시간 정보는 정말 다양하게 쓰이는데요, 몇 가지 예시를 통해 쿼리 작성하는 법을 함께 살펴보도록 해요! ^^

1. 특정 기간 동안의 데이터 조회하기 (쇼핑몰 주문량 분석)

쇼핑몰 데이터베이스에서 지난주 월요일부터 금요일까지 접수된 주문량을 확인해야 한다고 가정해 볼게요. 주문 테이블(orders)에 order_date라는 TIMESTAMP 타입 컬럼이 있다면 어떻게 쿼리를 작성해야 할까요? 바로 이렇게 하면 됩니다!

SELECT COUNT(*) AS total_orders
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) + 7 DAY) 
  AND order_date < DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) + 2 DAY);

CURDATE()는 현재 날짜를 반환하고, WEEKDAY()는 요일을 숫자(월요일: 0, 일요일: 6)로 반환해요. DATE_SUB()를 이용해서 지난주 월요일과 금요일의 날짜를 계산했어요! 이해하기 조금 어려울 수 있지만, 몇 번 해보다 보면 익숙해질 거예요~?

2. 회원 가입일 기준으로 특정 기간 이내 가입한 회원 조회 (마케팅 타겟 설정)

이번에는 2023년 7월 1일부터 2023년 7월 31일까지 가입한 회원을 찾아 마케팅 타겟으로 설정해야 한다고 해볼게요. 회원 테이블(users)의 registered_at 컬럼이 TIMESTAMP 타입이라면, 아래처럼 쿼리를 작성할 수 있어요.

SELECT user_id, user_name
FROM users
WHERE registered_at BETWEEN '2023-07-01 00:00:00' AND '2023-07-31 23:59:59';

BETWEEN 연산자를 사용하면 특정 범위 내의 값을 쉽게 찾을 수 있답니다! 여기서는 '2023-07-01 00:00:00'부터 '2023-07-31 23:59:59'까지, 7월 한 달 동안의 데이터를 조회하도록 했어요. TIMESTAMP는 초 단위까지 저장하기 때문에, 7월 31일 23시 59분 59초까지 포함해야 정확한 결과를 얻을 수 있겠죠?!

3. 특정 형식으로 날짜 표시하기 (보고서 생성)

보고서에 날짜를 “YYYY년 MM월 DD일” 형식으로 표시해야 한다면 DATE_FORMAT() 함수가 딱이에요! orders 테이블의 order_date 컬럼을 예시로 들어볼게요.

SELECT order_id, DATE_FORMAT(order_date, '%Y년 %m월 %d일') AS formatted_date
FROM orders;

%Y, %m, %d는 각각 연도, 월, 일을 나타내는 형식 지정자예요. 이 외에도 다양한 형식 지정자가 있으니 필요에 따라 활용하면 된답니다! 원하는 형식으로 날짜를 표시할 수 있다는 건 정말 편리한 기능이죠~?!

4. 날짜 계산 활용하기 (이벤트 기간 계산)

이벤트 시작일로부터 7일 후에 이벤트 종료일을 자동으로 계산해야 한다면 어떻게 해야 할까요? DATE_ADD() 함수를 사용하면 간단하게 해결할 수 있어요!

SELECT event_start_date, DATE_ADD(event_start_date, INTERVAL 7 DAY) AS event_end_date
FROM events;

INTERVAL 7 DAY는 7일을 더한다는 의미예요. 이처럼 DATE_ADD() 함수를 사용하면 날짜 계산을 쿼리 내에서 직접 처리할 수 있어서 정말 유용해요! DATE_SUB() 함수를 사용하면 날짜를 빼는 것도 가능하답니다.

5. 현재 시간 기록하기 (로그 데이터 저장)

웹사이트 로그 데이터를 저장할 때, NOW() 함수를 사용하여 현재 시간을 기록할 수 있어요. 로그 테이블(logs)에 log_time 컬럼이 있다면, 아래처럼 쿼리를 작성하면 됩니다.

INSERT INTO logs (log_time, log_message)
VALUES (NOW(), 'User logged in');

NOW() 함수는 쿼리가 실행되는 시점의 현재 시간을 반환하므로, 정확한 로그 기록이 가능해요! 로그 데이터 분석에 필수적인 요소죠!

6. 시간대 고려하기 (글로벌 서비스)

글로벌 서비스를 운영하는 경우, 시간대를 고려해야 하는 경우가 많아요. CONVERT_TZ() 함수를 사용하면 특정 시간대의 시간을 다른 시간대로 변환할 수 있답니다!

SELECT CONVERT_TZ(order_date, 'UTC', 'Asia/Seoul') AS seoul_time
FROM orders;

UTC는 협정 세계시를 의미하고, Asia/Seoul은 한국 표준시를 의미해요. 이처럼 CONVERT_TZ() 함수를 사용하면 시간대 차이를 쉽게 처리할 수 있어요!

이 외에도 NOW(), DATE_FORMAT(), TIMESTAMP를 활용한 다양한 쿼리 작성이 가능해요. 여러분의 상황에 맞게 응용해서 사용해 보세요! 이제 SQL에서 날짜와 시간 다루는 게 더 이상 어렵지 않겠죠? 다양한 함수와 데이터 타입을 활용해서 데이터 분석의 힘을 느껴보세요! 파이팅! ^^!

 

자, 이제 SQL의 날짜와 시간 함수에 대해 조금 더 친해진 것 같지 않나요? NOW 함수로 현재 시간을 딱! 잡아내고, DATE_FORMAT으로 예쁘게 꾸며주는 것도 배웠어요. TIMESTAMP는 좀 더 깊이 있는 친구였죠? 이 친구 덕분에 정확한 시간 기록이 가능하다는 것도 알았고요. 실제로 쿼리까지 써보면서 감을 잡았으니 이젠 실전에서도 훨씬 자신감 있게 활용할 수 있을 거예요! 데이터 다루는 재미, 이제 막 시작이랍니다. 앞으로도 더 재밌는 SQL 이야기로 만나요! 궁금한 점 있으면 언제든지 질문하세요. 😉

 

Itlearner

Share
Published by
Itlearner

Recent Posts

SQL에서 윈도우 함수(ROW_NUMBER, RANK, DENSE_RANK) 사용법

안녕하세요! 데이터 분석하면 머리가 지끈거리시는 분들 많으시죠? 저도 그랬어요. 그런데 SQL의 강력한 기능인 윈도우 함수를…

5시간 ago

SQL에서 문자열 다루기 (CONCAT, SUBSTRING, REPLACE 등)

안녕하세요, 여러분! 데이터베이스 만질 때 은근히 까다로운 게 바로 문자열 다루기잖아요? 저도 처음엔 그랬어요. 그래서…

14시간 ago

SQL에서 IFNULL과 COALESCE 차이점과 활용법

안녕하세요, 여러분! 데이터베이스 다루다 보면 빈 값 때문에 골치 아팠던 적, 다들 한 번쯤 있으시죠?…

20시간 ago

SQL에서 CASE WHEN을 활용한 조건별 데이터 출력

안녕하세요, 여러분! 데이터베이스 다루다 보면 복잡한 조건에 따라 다른 결과값을 출력해야 하는 경우가 정말 많죠?…

1일 ago

SQL에서 TRUNCATE로 테이블 전체 데이터 삭제하기

데이터베이스 다루다 보면, 테이블 데이터를 싹 날려버리고 싶을 때가 있죠? 그럴 때 `TRUNCATE` 명령어가 얼마나…

1일 ago

SQL에서 DELETE로 특정 행 삭제하기

데이터베이스 다루다 보면, 원치 않는 데이터를 삭제해야 할 때가 종종 있죠? 마치 옷장 정리하듯이 말이에요!…

1일 ago