MySQL에서 특정 날짜 형식의 날짜를 테이블에 삽입하려면 STR_TO_DATE() 함수를 사용하고, 날짜 값은 작은따옴표(' ')로 감싸 문자열 형태로 전달하면 됩니다. 이 함수는 문자열로 입력된 날짜를 지정한 형식 지정자에 맞춰 해석하여 DATE 또는 DATETIME 값으로 변환해 줍니다.
STR_TO_DATE() 기본 문법
INSERT INTO 테이블명 VALUES(값1, 값2, ...... 값N, STR_TO_DATE('임의의날짜', '%Y-%m-%d'));위 문법에서 '%Y-%m-%d'는 입력되는 날짜 문자열의 형식을 의미합니다. 예를 들어 '2018-11-28'처럼 연도-월-일 순서로 된 문자열이라면 '%Y-%m-%d'와 같이 대응시켜 주는 방식입니다.
MySQL에서 자주 사용하는 날짜 형식 지정자
STR_TO_DATE()와 DATE_FORMAT()에서 공통으로 사용할 수 있는 주요 형식 지정자는 다음과 같습니다.
| 형식 지정자 | 설명 |
|---|---|
| %a | 축약된 요일 이름 (Sun ~ Sat) |
| %b | 축약된 월 이름 (Jan ~ Dec) |
| %c | 숫자 형식의 월 (0 ~ 12) |
| %D | 영어 접미사가 붙은 일 (1st, 2nd, 3rd, ...) |
| %d | 두 자리 숫자 형식의 일 (01 ~ 31) |
| %e | 숫자 형식의 일 (0 ~ 31) |
| %f | 마이크로초 (000000 ~ 999999) |
| %H | 24시간제 시간 (00 ~ 23) |
| %h | 12시간제 시간 (01 ~ 12) |
| %I | 12시간제 시간 (01 ~ 12) |
| %i | 분 (00 ~ 59) |
| %j | 연중 몇 번째 날인지 나타내는 값 (001 ~ 366) |
| %k | 24시간제 시간 (0 ~ 23) |
| %l | 12시간제 시간 (1 ~ 12) |
| %M | 전체 월 이름 (January ~ December) |
| %m | 숫자 형식의 월 (00 ~ 12) |
| %p | 오전/오후 표시 (AM 또는 PM) |
| %r | 12시간제 시간 표기 (hh:mm:ss AM/PM) |
| %S | 초 (00 ~ 59) |
| %s | 초 (00 ~ 59) |
| %T | 24시간제 시간 표기 (hh:mm:ss) |
| %U | 일요일을 한 주의 시작으로 계산한 주 번호 (00 ~ 53) |
| %u | 월요일을 한 주의 시작으로 계산한 주 번호 (00 ~ 53) |
| %V | 일요일을 한 주의 시작으로 계산한 주 번호 (01 ~ 53). %X와 함께 사용 |
| %v | 월요일을 한 주의 시작으로 계산한 주 번호 (01 ~ 53). %x와 함께 사용 |
| %W | 전체 요일 이름 (Sunday ~ Saturday) |
| %w | 숫자 형식의 요일 (일요일 = 0, 토요일 = 6) |
| %X | 일요일을 주의 시작으로 계산했을 때 해당 주가 속한 연도 |
| %x | 월요일을 주의 시작으로 계산했을 때 해당 주가 속한 연도 |
| %Y | 네 자리 숫자 형식의 연도 |
| %y | 두 자리 숫자 형식의 연도 |
실습 예제
1. 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table BookDateDemo
-> (
-> BookName varchar(200),
-> BookIssueDate datetime
-> );
Query OK, 0 rows affected (0.44 sec)
BookName(책 이름)과 BookIssueDate(대출일) 두 개의 컬럼을 가진 테이블입니다.
2. STR_TO_DATE()로 날짜 삽입
앞서 설명한 문법을 적용해 날짜를 작은따옴표로 감싸서 삽입해 보겠습니다.
mysql> insert into BookDateDemo values('Let us C', str_to_date('2018-11-28', '%Y-%m-%d'));
Query OK, 1 row affected (0.11 sec)
mysql> insert into BookDateDemo values('The C++ Programming', str_to_date('2018-11-29', '%Y-%m-%d'));
Query OK, 1 row affected (0.16 sec)
mysql> insert into BookDateDemo values('C in Depth', str_to_date('2018-11-20', '%Y-%m-%d'));
Query OK, 1 row affected (0.23 sec)세 건의 데이터가 모두 오류 없이 정상적으로 삽입되었습니다.
3. 저장된 데이터 확인
SELECT 문을 사용해 테이블의 모든 레코드를 조회합니다.
mysql> select * from BookDateDemo;
실행 결과는 다음과 같습니다.
+---------------------+---------------------+
| BookName | BookIssueDate |
+---------------------+---------------------+
| Let us C | 2018-11-28 00:00:00 |
| The C++ Programming | 2018-11-29 00:00:00 |
| C in Depth | 2018-11-20 00:00:00 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
정리 및 참고 사항
'2018-11-28'처럼 ISO 표준 형식(YYYY-MM-DD)의 문자열은 STR_TO_DATE() 없이 그대로 INSERT해도 MySQL이 자동으로 인식합니다. 하지만 '28/11/2018'과 같이 비표준 형식의 날짜 문자열을 다룰 때는 반드시 STR_TO_DATE('28/11/2018', '%d/%m/%Y')처럼 형식 지정자를 명시해 주어야 올바르게 변환됩니다. 날짜 형식이 서로 다른 외부 데이터를 가져올 때 특히 유용하게 활용할 수 있습니다.