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

JooKit 주킷 2021. 9. 5. 19:19
목차 접기
728x90
반응형

mysql 연습 데이터로 쿼리 작성해보는 사이트로 이동

위 링크로 이동해서 아래 쿼리를 입력해보자.

CURRENT_DATE, CURDATE 현재 날짜 반환
CURRENT_TIME, CURTIME 현재 시간 반환
CURRENT_TIMESTAMP, NOW 현재 시간과 날짜 반환
DATE 문자열에 따라 날짜 생성
TIME 문자열에 따라 시간 생성
YEAR 주어진 DATETIME 값의 년도 반환
MONTHNAME 주어진 DATETIME 값의 (영문) 반환
MONTH  주어진 DATETIME 값의 반환
WEEKDAY 주어진 DATETIME 값의 요일값 반환(월요일:0, 화요일:1, …)
DAYNAME 주어진 DATETIME 값의 요일명 반환(영문)
DAYOFMONTH, DAY 주어진 DATETIME 값의 날짜() 반환 
HOUR 주어진 DATETIME 반환
MINUTE 주어진 DATETIME 반환
SECOND 주어진 DATETIME  반환
ADDDATE, DATE_ADD 시간/날짜 더하기 
SUBDATE, DATE_SUB 시간/날짜 빼기 
DATE_DIFF 시간/날짜 일수차
TIME_DIFF 시간/날짜 시간차
LAST_DAY 해당 달의 마지막 날짜 
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)
%l 
%S, %s  초
%p  AM/PM
STR_TO_DATE(S, F)  S F형식으로 해석하여 시간/날짜 생성
IF(조건, T, F) 조건이 참이라면 T, 거짓이면 F 반환 
IFNULL(A, B)  A NULL   B 출력 

 

 

 

SELECT  CURRENT_DATE(), CURRENT_TIME(), NOW();

 

 

SELECT CURRENT_DATE() AS DATE, 
	CURRENT_TIME() AS TIME, 
	NOW() AS NOW;

 

 

 

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');

출력 : 0, 1, 0, 1

 

 

 

 

문자열은 0이 들어가고 안들어가고 서로 같지 않다고 판단을 한다.

그러나 날짜와 시간 함수를 이용해서 문자열을 비교하게 되면 

함수들이 날짜와 시간으로 변환을 해주기 때문에 같다고 판단을 한다.

 

 

 

 

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');

출력 : 0, 1, 1, 0, 1, 1

DATE(), TIME() 함수들은 각각 날짜와 시간을 다루기 때문에 

서로를 비교하게되면 다른 위치의 문자열을 변환해서 반환하기 때문에 

결과값이 FALSE 이다.

 

 

 

 

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

문자열의 날짜를 DATE() 함수를 사용하면 날짜로 반환해주고 

BETWEEN 사용할 수도 있다.

 

 

 

 


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;

 

 

 

 

 

SELECT * 
FROM Orders
WHERE WEEKDAY(OrderDate) = 0;

의미 : 요일이 월요일인 데이터만 출력된다.

 

 

 

 

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

 

 

 

 

 

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);

 

 

 

 

 

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;

 

 

 

 

 

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

 

 

 

 

 

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

 

이처럼 NOW()를 먼저 써주면 일수찰를 양수로 나타낼 수 있다.

ABS() 함수를 사용하면 음수의 일수차를 양수로 표현할 수도 있다.

 

 

 

 

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

일수차가 나흘전, 후인 값을 출력해낼 수도 있다.

 

 

 

 

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

해당월의 마지막날이 몇일이 남았는지도 DATEDIFF 함수와 함께 사용해서 

출력할 수도 있다.

 

 

 

 

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', '오후'
)

 

 

 

 

 

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;

 

 

 

 

 

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

CASE를 쓰고 WHEN으로 조건을 걸고 THEN으로 출력할 값을 적는다.

CASE 사용하면 END 끝에 써주어야 한다.

 

 

 

 

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

 

 

 

 

 

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

 

728x90
반응형
LIST