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

chxxrin·2024년 4월 1일
0

sql

목록 보기
1/5

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

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

함수설명
CURRENT_DATECURDATE현재 날짜 반환
CURRENT_TIMECURTIME현재 시간 반환
CURRENT_TIMESTAMPNOW현재 시간과 날짜 반환
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값의 요일명 반환
DAYOFMONTHDAY주어진 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
함수설명
ADDDATEDATE_ADD시간/날짜 더하기
SUBDATEDATE_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개의 댓글

관련 채용 정보