처음부터 차근차근

MySQL 시간/날짜 관련 및 기타 함수들 본문

DB/MySQL

MySQL 시간/날짜 관련 및 기타 함수들

HangJu_95 2023. 6. 1. 20:13
728x90

1. 시간/날짜 관련 함수들

CURRENT_DATE, CURDATE 현재 날짜 반환
CURRENT_TIME, CURTIME 현재 시간 반환
CURRENT_TIMESTAMP, NOW 현재 시간과 날짜 반환

SELECT CURDATE(), CURTIME(), NOW();

DATE 문자열에 따라 날짜 생성
TIME 문자열에 따라 시간 생성

SELECT
  '2021-6-1' = '2021-06-01', // 문자열이기 때문에 다르다고 판단
  DATE('2021-6-1') = DATE('2021-06-01'), // 날짜로 변경 후 판단
  '1:2:3' = '01:02:03', 
  TIME('1:2:3') = TIME('01:02:03');

 

SELECT
  '2021-6-1 1:2:3' = '2021-06-01 01:02:03',
  DATE('2021-6-1 1:2:3') = DATE('2021-06-01 01:02:03'), 
  TIME('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'),
  DATE('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'), // DATE는 날짜, TIME은 시간만 가져갔기 떄문에 False
  DATE('2021-6-1') = DATE('2021-06-01 01:02:03'), // 둘 다 Date 날짜가 같기 때문에 True
  TIME('2021-6-1 1:2:3') = TIME('01:02:03'); // 시간이 같기 때문에 True

SELECT * FROM Orders
WHERE
  OrderDate BETWEEN DATE('1997-1-1') AND DATE('1997-1-31');

 

YEAR 주어진 DATETIME값의 년도 반환
MONTHNAME 주어진 DATETIME값의 월(영문) 반환
MONTH 주어진 DATETIME값의 월 반환
WEEKDAY 주어진 DATETIME값의 요일값 반환(월요일: 0)
DAYNAME 주어진 DATETIME값의 요일명 반환
DAYOFMONTH, DAY 주어진 DATETIME값의 날짜(일) 반환

SELECT
  OrderDate,
  YEAR(OrderDate) AS YEAR,
  MONTHNAME(OrderDate) AS MONTHNAME,
  MONTH(OrderDate) AS MONTH,
  WEEKDAY(OrderDate) AS WEEKDAY,
  DAYNAME(OrderDate) AS DAYNAME,
  DAY(OrderDate) AS DAY
FROM Orders;

SELECT
  OrderDate,
  CONCAT(
    CONCAT_WS(
      '/',
      YEAR(OrderDate), MONTH(OrderDate), DAY(OrderDate)
    ),
    ' ',
    UPPER(LEFT(DAYNAME(OrderDate), 3))
  )
FROM Orders;

 

CONCAT_WS 내부 함수부터 '/' 를 사이에 두고 합친 뒤, CONCAT으로 DAYNAME을 3자만, ' ' 공백을 줘서 합치기

SELECT * FROM Orders
WHERE WEEKDAY(OrderDate) = 0; (월요일만 나타내기)

HOUR 주어진 DATETIME의 시 반환
MINUTE 주어진 DATETIME의 분 반환
SECOND 주어진 DATETIME의 초 반환

SELECT
  HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());

 

ADDDATE, DATE_ADD 시간/날짜 더하기
SUBDATE, DATE_SUB 시간/날짜 빼기

SELECT 
  ADDDATE('2021-06-20', INTERVAL 1 YEAR),
  ADDDATE('2021-06-20', INTERVAL -2 MONTH),
  ADDDATE('2021-06-20', INTERVAL 3 WEEK),
  ADDDATE('2021-06-20', INTERVAL -4 DAY),
  ADDDATE('2021-06-20', INTERVAL -5 MINUTE), // 시간이 없다면 00:00:00부터 계산
  ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);

SELECT
  OrderDate,
  ADDDATE(OrderDate, INTERVAL 1 YEAR),
  ADDDATE(OrderDate, INTERVAL -2 MONTH),
  ADDDATE(OrderDate, INTERVAL 3 WEEK),
  ADDDATE(OrderDate, INTERVAL -4 DAY),
  ADDDATE(OrderDate, INTERVAL -5 MINUTE)
FROM Orders;

 

DATE_DIFF 두 시간/날짜 간 일수차
TIME_DIFF 두 시간/날짜 간 시간차

SELECT
  OrderDate,
  NOW(),
  DATEDIFF(OrderDate, NOW())
FROM Orders;

SELECT
  TIMEDIFF('2021-06-21 15:20:35', '2021-06-21 16:34:41');

SELECT * FROM Orders
WHERE
  ABS(DATEDIFF(OrderDate, '1996-10-10')) < 5;

LAST_DAY 해당 달의 마지막 날짜

SELECT
  OrderDate,
  LAST_DAY(OrderDate),
  DAY(LAST_DAY(OrderDate)),
  DATEDIFF(LAST_DAY(OrderDate), OrderDate)
FROM Orders;

DATE_FORMAT 시간/날짜를 지정한 형식으로 반환
%Y 년도 4자리
%y 년도 2자리
%M 월 영문
%m 월 숫자
%D 일 영문(1st, 2nd, 3rd...)
%d, %e 일 숫자 (01 ~ 31)
%T hh:mm:ss
%r hh:mm:ss AM/PM
%H, %k 시 (~23)
%h, %l 시 (~12)
%i
%S, %s
%p AM/PM

SELECT
  DATE_FORMAT(NOW(), '%M %D, %Y %T'),
  DATE_FORMAT(NOW(), '%y-%m-%d %h:%i:%s %p'),
  DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초');

SELECT REPLACE(
  REPLACE(
    DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %초'),
    'AM', '오전'
  ),
  'PM', '오후'
)

 

STR _ TO _ DATE(S, F) S를 F형식으로 해석하여 시간/날짜 생성

SELECT
  DATEDIFF(
    STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
    STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
  ),
  TIMEDIFF(
    STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
    STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
  );

SELECT
  OrderDate,
  DATEDIFF(
    STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
    OrderDate
  ),
  TIMEDIFF(
    STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
    STR_TO_DATE(CONCAT(OrderDate, ' ', '00:00:00'), '%Y-%m-%d %T')
  )
FROM Orders;

 

 

2. 기타 함수들

IF(조건, T, F) 조건이 참이라면 T, 거짓이면 F 반환

SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.');

보다 복잡한 조건은 CASE문 사용

SELECT
CASE
  WHEN -1 > 0 THEN '-1은 양수다.'
  WHEN -1 = 0 THEN '-1은 0이다.'
  ELSE '-1은 음수다.'
END;

SELECT
  Price,
  IF (Price > 30, 'Expensive', 'Cheap'),
  CASE
    WHEN Price < 20 THEN '저가'
    WHEN Price BETWEEN 20 AND 30 THEN '일반'
    ELSE '고가'
  END
FROM Products;

IFNULL(A, B) A가 NULL일 시 B 출력

SELECT
  IFNULL('A', 'B'),
  IFNULL(NULL, 'B');

 

https://www.yalco.kr/@sql/1-4/

 

시간/날짜 관련 및 기타 함수들

어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!

www.yalco.kr

 

'DB > MySQL' 카테고리의 다른 글

MySQL 쿼리 안에 서브쿼리  (0) 2023.06.01
MySQL 조건에 따라 그룹으로 묶기  (0) 2023.06.01
숫자와 문자열을 다루는 함수들  (0) 2023.05.29
각종 연산자들  (0) 2023.05.29
SELECT 기능  (0) 2023.05.29