목차
접기
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
'SQL' 카테고리의 다른 글
[ mysql ] 새로 생성한 계정에 root 권한 부여 하는 방법 (0) | 2021.09.13 |
---|---|
[ mysql ] 쿼리 안에 서브쿼리 (0) | 2021.09.07 |
[ mysql ] 숫자와 문자열을 다루는 함수(TRIM, LTRIM, RTRIM, LPAD, RPAD, INSTR) (0) | 2021.09.02 |
[ mysql ] 숫자와 문자열을 다루는 함수(SUBSTR, SUBSTRING, LEFT, RIGHT, LENGTH, CHAR_LENGTH, CHARACTER_LENGTH) (0) | 2021.09.02 |
[ mysql ] 숫자와 문자열을 다루는 함수(UPPER, LOWER, CONCAT(...), CONCAT-WS(S, ...)) (0) | 2021.09.02 |