MySQL 날짜 , 날짜함수
날짜 자료형에는 어떤 것들이 있는가 ?
1.DATE - 년,월,일 을 나타 내주고
2.TIME - 시,분,초 을 나타 내주고
3.DATETIME - 년,월,일,시,분,초 까지
4.TIMESTAMP - 년,월,일,시,분,초 까지
DATETIME 과 TIMESTAMP는 년,월,일 ,시,분,초 까지 나타내준다는 공통점이 있지만
차이점도 존재한다.
1)지원 범위
datetime 은 1000-01-01 00:00:00~9999-12-31 23:59:59
timestamp는 1970-01-01 00:00:00~ 2038~01-19 03:14:00
2)컬럼 타입
datetime은 문자형 VARCHAR
timestamp는 숫자형 INT 으로 변환되어 저장
3)저장되는 공간
datetime은 8byte
timestamp는 4byte를 차지
4)자동입력 여부
datetime은 수정할 일이 있으면 그때마다 날짜를 입력해 줘야함
timestamp는 날짜를 따로 입력 안해줘도 자동으로 입력이 가능(CURRENT_TIMESTAMP)
예 ) 우리나라에서 오후 3시에 저장된 값이 DATETIME 이라면
미국에 있는 사람도 오후 3시로 보이겠지만, TIMESTAMP를 이용하면 시차에 맞게 변환하여 저장해준다.
읽는 곳마다 해당 시간대로 보이도록 할 때는 TIMESTAMP 를, 어디에서든 똑같이 보이도록 할 시간은 DATETIME을 사용하면 된다.
자료형을 언제 사용해야 하는가 ?
정적언어라는 것은 '타입' 즉 자료형을 컴파일 시에 결정한다. 정적언어의 종류에는 C, C#, C++, Java 등의 언어가 있습니다. 이들 언어는 변수에 들어갈 값의 형태에 따라 자료형을 지정해주어야 한다. 컴파일 시에 자료형에 맞지 않은 값이 들어있으면 컴파일 에러가 발생한다.
'MySQL'은 자바처럼 테이블 내 필드값을 설정할 때 자료형을 꼭 기입해야 한다.
(+ 동적언어 ---> JavaScript, Ruby, Python, SmallTalk 등이 바로 동적언어입니다. 동적 타입 언어의 자료형은 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 결정합니다. 다음과 같이 타입 없이 변수만 선언하여 값을 지정할 수 있습니다.)
날짜 함수 사용하기
MySQL 날짜 함수는 날짜 및 날짜 관련 데이터와 관련된 다양한 용도로 사용된다. 이러한 함수들을
사용하면 날짜 및 시간 값을 다루는데 편리한 기능을 제공한다.
MySQL의 날짜 함수는 날짜 기능을 사용해 일 월 또는 년을 더하거나 빼는 등 계산이 가능하다.
그리고 날짜의 형식을 바꾸는 기능이 있다.
또 현재 날짜를 추출하거나 다른 날짜와 비교하는 기능도 제공한다.
이러한 MySQL의 날짜 함수는 날짜와 시간을 계산하는데 유용하며, 데이터 조작, 분석, 집계등의 작업을 하는데에
사용될 수 있습니다.

SELECT NOW(), // 지금 (년,월,일)
CURDATE(), // 현재 날짜 (년,월,일)
CURTIME(); // 현재 시간 (시,분,초)
SELECT DATE(NOW()), // 지금 날짜 보여줘
-> YEAR(NOW()), // 지금 년도 보여줘
-> MONTH(NOW()), // 지금 월 보여줘
-> DAY(NOW()), // 지금 일 보여줘
-> HOUR(NOW()), // 지금 시간 보여줘
-> MINUTE(NOW()), // 지금 분 보여줘
-> SECOND(NOW()); // 지금 초 보여줘
<시간이나 날짜를 계산해주는 함수>
INTERVAL 범위 및 간격(시간의 간격) 이라는 뜻
SELECT ADDDATE("2022-06-12", INTERVAL 10 DAY), // 10일뒤
SELECT ADDDATE(NOW(), INTERVAL 10 DAY); // 지금의 10일뒤
SELECT SUBDATE(NOW(), INTERVAL 15 MONTH); // 지금의 15개월 전
SELECT TIMEDIFF('2022-06-12 12:34:56', '2022-06-10 12:34:56');
TIMEDIFF(time1, time2) - 두 시간의 차이를 datetime 형태로 반환(time1 - time2)
시간이나 날짜의 형식을 바꿔줄 수 있는 함수
SELECT DATE_FORMAT(NOW(),'%Y - %m - %d'); 대소문자 구분도 함
/////////////////////////////////////////////////////////
DATE(expression) - 주어진 expression에 해당하는 날짜 정보 반환
MONTH(date) - 주어진 date에서 월에 해당하는 숫자를 반환(0~12)
DAY(date) - 주어진 date에서 일자에 해당하는 숫자를 반환(0~31)
HOUR(date) - 주어진 date에서 시간에 해당하는 숫자를 반환(0~23)
MINUTE(date) - 주어진 date에서 분에 해당하는 숫자를 반환(0~59)
SECOND(date) - 주어진 date에서 초에 해당하는 숫자를 반환(0~59)
WEEKDAY(date) - 주어진 date에서 요일에 해당하는 숫자를 반환(월요일=0, 일요일=6)
DAYOFWEEK(date) - 주어진 date에서 요일에 해당하는 숫자를 반환 ( 일요일 = 1, 토요일 = 7)
DAYNAME(date) - 주어진 date의 영어식 요일 이름 반환
MONTHNAME(date) - 주어진 date의 영어식 월 이름 반환
LAST_DAY(date) - 주어진 date에서 해당 월의 마지막 날짜 정보 반환
SEC_TO_TIME(seconds) - 주어진 seconds를 기준으로 시간 정보 반환(HH:MM:SS 형식)
TIME_TO_SEC(time) - 주어진 time을 초 단위로 바꿔준다
EXTRACT(part FROM date) - 주어진 date에서 원하는 part에 해당하는 숫자를 반환
NOW(), CURRENT_TIMESTAMP() - 현재 날짜와 시간 반환
CURDATE(), CURRENT_DATE() - 현재 날짜 반환
CURTIME(), CURRENT_TIME() - 현재 시각 반환
ADDDATE(date, INTERVAL value addunit) - date에 value addunit 만큼 시간/날짜를 추가한 date를 반환(INTERVAL value addunit 대신 days도 가능)
ADDTIME(datetime, addtime) - datetime에 addtime 만큼 시간을 추가한 datetime을 반환
SUBDATE(date, INTERVAL value unit) - date에 value addunit 만큼 시간/날짜를 뺀 date를 반환(INTERVAL value addunit 대신 days도 가능)
mysql> SELECT SUBDATE('2008-01-02', INTERVAL 31 DAY);
| 2007-12-02 |
SUBTIME(datetime, addtime) - datetime에 addtime 만큼 시간을 뺀 datetime을 반환
PERIOD_ADD(period, number) - 주어진 period에 number만큼 월을 추가한 숫자를 반환(period의 형식은 YYMM 또는 YYYYMM만 가능)
DATE_FORMAT(date, format) - format의 정의에 따라 날짜 혹은 시간을 출력한다. 매우 빈번히 쓰이는 함수이다
%m - 월이름 (january..december)
%w - 요일명 (sunday..saturday)
%d - 영어식 접미사를 붙인 일(1st, 2nd, 3rd, etc.)
%y - 4자리 년도
%y - 2자리 년도
%a - 짧은 요일명(sun..sat)
%d - 일(00..31)
%e - 일(0..31)
%m - 월(01..12)
%c - 월(1..12)
%b - 짧은 월이름 (jan..dec)
%j - 한해의 몇 번째 요일인가 (001..366)
%h - 24시 형식의 시간 (00..23)
%k - 24시 형식의 시간 (0..23)
%h - 12시 형식의 시간 (01..12)
%i - 12시 형식의 시간 (01..12)
%l - 시간 (1..12)
%i - 분 (00..59)
%r - 시분초12시 형식 (hh:mm:ss [ap]m)
%t - 시분초 24시 형식 (hh:mm:ss)
%s - 초 (00..59)
%s - 초 (00..59)
%p - am 또는 pm 문자
%w - 일주일의 몇 번째 요일인가(0=sunday..6=saturday)
%U - 한해의 몇 번째 주인가(0..52). 일요일이 시작일
%u - 한해의 몇 번째 주인가(0..52). 월요일이 시작일
%% - `%' 문자를 나타냄
PERIOD_DIFF(period1, period2) - 두 기간의 차이를 숫자로 반환(period의 형식은 YYMM 또는 YYYYMM만 가능, period1과 period2는 같은 형식이어야 함)
DATEDIFF(date1, date2) - 두 날짜 사이의 일수를 숫자로 반환(date1 - date2)
TIMEDIFF(time1, time2) - 두 시간의 차이를 datetime 형태로 반환(time1 - time2)