데이터 처리 도구/SQL

[MySQL] 날짜/시간 다루기 (1)

yourhm 2022. 5. 6. 16:27

1. 현재 날짜/시간 출력하기

mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
+---------------------+----------+---------------------+

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
+---------------------+----------+---------------------+

SELECT CURDATE();
-- OUTPUT: '2022-05-01'

SELECT CURDATE() + 0;
-- OUTPUT: 20220501

NOW()

- 현재 날짜와 시간을 출력하기 (쿼리 명령문이 실행을 시작하는 시간을 나타낸다.)

- 출력 형식: 'YYYY-MM-DD hh:mm:ss' or YYYYMMDDhhmmss

 

SYSDATE()

- 현재 날짜와 시간을 출력하기 (쿼리 명령문 안에서 해당 함수가 실행을 시작하는 시간을 나타낸다)

- 출력 형식: 'YYYY-MM-DD hh:mm:ss' or YYYYMMDDhhmmss

 

CURDATE()

- 현재 날짜만 출력하기

- 출력 형식: 'YYYY-MM-DD' or YYYYMMDD

 

 

2. 날짜/시간 부분만 추출하기

SELECT DATE("2017-06-30 01:02:03");
-- OUTPUT: 2017-06-30

SELECT MONTH("2017-06-30");
-- OUTPUT: 6

SELECT DAYOFMONTH("2017-06-30");
-- OUTPUT: 30

SELECT DAYOFYEAR("2017-06-30");
-- OUTPUT: 181

DATE(expr)

- date나 datetime expression 에서 'date' 부분만 추출하기

 

YEAR(date)

- date에서 '연도' 부분만 추출하기 (1000 - 9999)

 

MONTH(date)

- date에서 '월' 부분만 추출하기 (0 - 12)

- '월' 부분이 0인 date는 0으로 반환한다. ('0000-00-00' or '2008-00-00' ⇒ 0)

 

DAYOFMONTH(date) = DAY(date)

- date의 '일' 부분이 해당 월에서 몇 일째인지 추출하기 (0 - 31)

- '일' 부분이 0인 date는 0으로 반환한다. ('0000-00-00' or '2008-12-00' ⇒ 0)

 

DAYOFYEAR(date)

- date의 '일' 부분이 해당 연도에서 몇 일째인지 추출하기 (1 - 366)

 

 

SELECT DAYNAME("2022-07-01");
-- OUTPUT: Friday

SELECT DAYOFWEEK("2022-07-01");
-- OUTPUT: 6

DAYNAME(date)

- 해당 날짜의 요일 이름만 추출하기

 

DAYOFWEEK(date)

- 해당 날짜의 요일 인덱스만 추출하기

 

요일 Sunday Monday Tuesday Wednesday Thursday Friday Saturday
인덱스 1 2 3 4 5 6 7

 

 

SELECT HOUR("2017-06-15 15:20:09");
-- OUTPUT: 15

SELECT HOUR("272:59:59");
-- OUTPUT: 272

TIME(expr)

- time나 datetime expression 에서 'time' 부분만 추출해서 문자열(string) 타입으로 반환하기.

 

HOUR(time)

- time에서 '시' 부분만 추출하기

- time-of-day 의 값인 경우, 반환하는 값의 범위는 0 - 23 이다.

- 그러나 time 값의 범위는 실제로 훨씬 크므로 HOUR는 23보다 큰 값을 반환할 수 있다.

 

MINUTE(time)

- time에서 '분' 부분만 추출하기 (0 - 59)

 

SECOND(time)

- time에서 '초' 부분만 추출하기 (0 - 59)

 

 

 

3. 날짜/시간을 지정한 형식대로 출력하기 (DATE_FORMAT)

SELECT DATE_FORMAT("2017-06-15", "%Y");
-- OUTPUT: 2017

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %r');
-- OUTPUT: 2022-05-04 08:41:45 AM

 

※ 날짜/시간 형식

%Y 연도(숫자 - 4자리) %T hh:mm:ss
%y 연도(숫자 - 2자리) %r hh:mm:ss AM/PM
%m 월(숫자 - 2자리) %H 시간 (24시간)
%c 월(숫자 - 원래대로) %h or %I(대문자 아이) 시간 (12시간 - 2자리)
%d 일(숫자 - 2자리) %l(소문자 엘) 시간 (12시간 - 원래대로)
%e 일(숫자 - 원래대로) %i
%M 월(영문 - 길게) %s or %S
%b 월(영문 - 짧게) %p AM, PM
%W 요일(영문 - 길게)    
%a 요일(영문 - 짧게)    

 

 

 

4. 날짜/시간이 문자열 타입으로 저장되어 있는 경우, 형변환하기

-- (1) 문자열과 포맷을 맞췄을 경우
SELECT STR_TO_DATE('20220504090000', '%Y%m%d%H%i%s') -- OUTPUT: 2022-05-04 09:00:00

SELECT STR_TO_DATE('20220504', '%Y%m%d') -- OUTPUT: 2022-05-04

SELECT STR_TO_DATE('090000', '%H%i%s') -- OUTPUT: 09:00:00

SELECT STR_TO_DATE('May 4, 2022', '%M %e,%Y') -- OUTPUT: 2022-05-04

SELECT STR_TO_DATE('04,5,2022', '%d,%c,%Y') -- OUTPUT: 2022-05-04

-- (2) 문자열과 포맷이 다를 경우
SELECT STR_TO_DATE('04,5,2022', '%d%m%Y') -- OUTPUT: NULL

STR_TO_DATE(str, format)

- 문자열을 DATE or TIME or DATETIME 데이터 타입으로 변환하여 출력한다.

- 문자열과 포맷이 다를 경우 NULL 을 반환하기 때문에, 문자열과 포맷을 꼭 동일하게 맞춰 주어야 한다.

 

 

 

 

[참고] 12.7 Date and Time Functions

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

 

MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions

12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

dev.mysql.com