[SQL] 1-4. 시간/날짜 관련 및 기타 함수들

chxxrin·2024년 4월 1일

sql

목록 보기
1/5

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

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

함수설명
CURRENT_DATE, CURDATE현재 날짜 반환
CURRENT_TIME, CURTIME현재 시간 반환
CURRENT_TIMESTAMP, NOW현재 시간과 날짜 반환
SELECT CURDATE(), CURTIME(), NOW();

날짜, 시간 생성 : DATE(), TIME()

함수설명
DATE문자열에 따라 날짜 생성
TIME문자열에 따라 시간 생성
SELECT
  '2021-6-1' = '2021-06-01', -- 문자열 자체는 다름!
  DATE('2021-6-1') = DATE('2021-06-01'), -- 근데 DATE() 에 넣는 순간 날짜로 변환하므로 같음!
  '1:2:3' = '01:02:03', -- 문자열 자체는 다름!
  TIME('1:2:3') = TIME('01:02:03');  -- 근데 TIME() 에 넣는 순간 시간으로 변환하므로 같음!
0101
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('2021-6-1') = DATE('2021-06-01 01:02:03'),
  TIME('2021-6-1 1:2:3') = TIME('01:02:03');
011011
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;
OrderDateYEARMONTHNAMEMONTHWEEKDAYDAYNAMEDAY
1996-07-041996July73Thursday4
SELECT
  OrderDate,
  CONCAT(
    CONCAT_WS(
      '/',
      YEAR(OrderDate), MONTH(OrderDate), DAY(OrderDate)
    ),
    ' ',
    UPPER(LEFT(DAYNAME(OrderDate), 3))
  )
FROM Orders;
1996-07-041996/7/4 THU
SELECT * FROM Orders
WHERE WEEKDAY(OrderDate) = 0;
OrderIDCustomerIDEmployeeIDOrderDateShipperID
102503441996-07-082
함수설명
HOUR주어진 DATETIME의 시 반환
MINUTE주어진 DATETIME의 분 반환
SECOND주어진 DATETIME의 초 반환
SELECT
  HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
HOUR(NOW())MINUTE(NOW())SECOND(NOW())
151416
함수설명
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),
  ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);
2022-06-202021-04-202021-07-112021-06-16
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;
1996-07-041997-07-041996-05-041996-07-25
함수설명
DATEDIFF두 시간/날짜 간 일수차
TIMEDIFF두 시간/날짜 간 시간차
SELECT
  OrderDate,
  NOW(),
  DATEDIFF(OrderDate, NOW())
FROM Orders;
rderDateNOW()DATEDIFF(OrderDate, NOW())
1996-07-042024-03-27 15:15:36-10128
SELECT
  TIMEDIFF('2021-06-21 15:20:35', '2021-06-21 16:34:41');

  • 01:14:06

SELECT * FROM Orders
WHERE
  ABS(DATEDIFF(OrderDate, '1996-10-10')) < 5;
OrderIDCustomerIDEmployeeIDOrderDateShipperID
103233941996-10-071
함수설명
LAST_DAY해당 달의 마지막 날짜
SELECT
  OrderDate,
  LAST_DAY(OrderDate),
  DAY(LAST_DAY(OrderDate)),
  DATEDIFF(LAST_DAY(OrderDate), OrderDate)
FROM Orders;
OrderDateLAST_DAY(OrderDate)DAY(LAST_DAY(OrderDate))DATEDIFF(LAST_DAY(OrderDate), OrderDate)
1996-07-041996-07-313127

날짜 형식 변환

함수설명
DATE_FORMAT시간/날짜를 지정한 형식으로 반환
형식설명
%Y년도 4자리
%y년도 2자리
%M월 영문
%m월 숫자
%D일 영문(1st, 2nd, 3rd...)
%d, %e일 숫자 (01 ~ 31)
%Thh:mm:ss
%rhh:mm:ss AM/PM
%H, %k시 (~23)
%h, %l시 (~12)
%i분
%S, %s초
%pAM/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초');
March 27th, 2024 15:17:2824-03-27 03:17:28 PM2024년 03월 27일 PM 03시 17분 28초
SELECT REPLACE(
  REPLACE(
    DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %초'),
    'AM', '오전'
  ),
  'PM', '오후'
)
  • 2024년 03월 27일 오후 03시 17분 초
함수설명
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')
  );
367:18:47
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;
1996-07-04181838:59:59

2. 기타 함수들

형식설명
IF(조건, T, F)조건이 참이라면 T, 거짓이면 F 반환
SELECT IF (1 > 2, '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;
21.00Cheap일반
38.00Expensive고가
6.00Cheap저가
형식설명
IFNULL(A, B)A가 NULL일 시 B 출력
SELECT
  IFNULL('A', 'B'),
  IFNULL(NULL, 'B');
AB

→ 앞쪽 값이 있으면 A출력, 앞쪽 값이 NULL이면 뒤쪽 값 B 출력!

0개의 댓글