



๐ก ์ฝํ ์์ ๊ฐ์ฅ ์์ฃผ ๋์ค๋ ๋ ์ง/์๊ฐ ํจ์๋ฅผ ์๋ฒฝ ์ ๋ฆฌํ๋ค.
์ฝ๋ฉํ ์คํธ ๋ฌธ์ ์ ํ:
โ ๋ ์ง ํจ์ ๋ชจ๋ฅด๋ฉด ๋ชป ํธ๋ ๋ฌธ์ ๋ง์!
[orders]
| order_id | user_id | amount | order_date | order_time |
|----------|---------|--------|------------|------------|
| 1 | 101 | 150000 | 2024-01-15 | 2024-01-15 14:30:00 |
| 2 | 102 | 50000 | 2024-01-20 | 2024-01-20 09:15:00 |
| 3 | 101 | 200000 | 2024-02-05 | 2024-02-05 18:45:00 |
| 4 | 103 | 80000 | 2024-02-10 | 2024-02-10 11:00:00 |
| ๊ธฐ๋ฅ | MySQL | PostgreSQL | BigQuery |
|---|---|---|---|
| ํ์ฌ ๋ ์ง | CURDATE() | CURRENT_DATE | CURRENT_DATE() |
| ํ์ฌ ์๊ฐ | NOW() | NOW() | CURRENT_TIMESTAMP() |
| ๋ ์ง ํฌ๋งท | DATE_FORMAT() | TO_CHAR() | FORMAT_DATE() |
| ๋ ์ง ์ถ์ถ | YEAR(), MONTH() | EXTRACT() | EXTRACT() |
| ๋ ์ง ์ฐ์ฐ | DATE_ADD() | + INTERVAL | DATE_ADD() |
SELECT
CURDATE() AS today, -- 2024-01-15
NOW() AS now, -- 2024-01-15 14:30:00
CURRENT_TIMESTAMP AS ts; -- 2024-01-15 14:30:00
SELECT
CURRENT_DATE AS today,
NOW() AS now,
CURRENT_TIMESTAMP AS ts;
SELECT
CURRENT_DATE() AS today,
CURRENT_TIMESTAMP() AS now;
SELECT
YEAR(order_date) AS year, -- 2024
MONTH(order_date) AS month, -- 1
DAY(order_date) AS day, -- 15
DAYOFWEEK(order_date) AS dow, -- 1(์ผ)~7(ํ )
WEEKDAY(order_date) AS weekday, -- 0(์)~6(์ผ)
HOUR(order_time) AS hour, -- 14
MINUTE(order_time) AS minute -- 30
FROM orders;
SELECT
EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(MONTH FROM order_date) AS month,
EXTRACT(DAY FROM order_date) AS day
FROM orders;
SELECT
EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(MONTH FROM order_date) AS month,
EXTRACT(DAYOFWEEK FROM order_date) AS dow -- 1(์ผ)~7(ํ )
FROM orders;
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS ym, -- 2024-01
DATE_FORMAT(order_date, '%Y-%m-%d') AS ymd, -- 2024-01-15
DATE_FORMAT(order_date, '%Y๋
%m์') AS kr, -- 2024๋
01์
DATE_FORMAT(order_time, '%H:%i') AS time -- 14:30
FROM orders;
์ฃผ์ ํฌ๋งท ์ฝ๋:
| ์ฝ๋ | ์๋ฏธ | ์์ |
|------|------|------|
| %Y | ์ฐ๋ 4์๋ฆฌ | 2024 |
| %y | ์ฐ๋ 2์๋ฆฌ | 24 |
| %m | ์ 2์๋ฆฌ | 01, 12 |
| %d | ์ผ 2์๋ฆฌ | 01, 31 |
| %H | ์๊ฐ 24์ | 00~23 |
| %i | ๋ถ | 00~59 |
| %s | ์ด | 00~59 |
| %W | ์์ผ ์ด๋ฆ | Monday |
| %w | ์์ผ ์ซ์ | 0(์ผ)~6(ํ ) |
SELECT
TO_CHAR(order_date, 'YYYY-MM') AS ym,
TO_CHAR(order_date, 'YYYY-MM-DD') AS ymd
FROM orders;
SELECT
FORMAT_DATE('%Y-%m', order_date) AS ym,
FORMAT_DATE('%Y-%m-%d', order_date) AS ymd
FROM orders;
SELECT
-- ๋ํ๊ธฐ
DATE_ADD(order_date, INTERVAL 7 DAY) AS plus_7days,
DATE_ADD(order_date, INTERVAL 1 MONTH) AS plus_1month,
DATE_ADD(order_date, INTERVAL 1 YEAR) AS plus_1year,
-- ๋นผ๊ธฐ
DATE_SUB(order_date, INTERVAL 7 DAY) AS minus_7days,
-- ๋๋ ์ง์ ์ฐ์ฐ
order_date + INTERVAL 7 DAY AS plus_7days2
FROM orders;
SELECT
DATEDIFF('2024-01-20', '2024-01-15') AS diff_days, -- 5
TIMESTAMPDIFF(MONTH, '2024-01-15', '2024-03-15') AS diff_months, -- 2
TIMESTAMPDIFF(HOUR, '2024-01-15 10:00:00', '2024-01-15 14:30:00') AS diff_hours -- 4
FROM dual;
SELECT
DATE_ADD(order_date, INTERVAL 7 DAY) AS plus_7days,
DATE_SUB(order_date, INTERVAL 1 MONTH) AS minus_1month,
DATE_DIFF(date1, date2, DAY) AS diff_days
FROM orders;
-- 2024๋
1์ ๋ฐ์ดํฐ
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
AND order_date < '2024-02-01';
-- ๋๋ BETWEEN (์ฃผ์: ๋ ๋ ์ง ํฌํจ)
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- ์ต๊ทผ 7์ผ
SELECT * FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
-- ์ต๊ทผ 30์ผ
SELECT * FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
-- 2024๋
๋ฐ์ดํฐ
SELECT * FROM orders
WHERE YEAR(order_date) = 2024;
-- 1์ ๋ฐ์ดํฐ (๋ชจ๋ ์ฐ๋)
SELECT * FROM orders
WHERE MONTH(order_date) = 1;
-- 2024๋
1์
SELECT * FROM orders
WHERE YEAR(order_date) = 2024
AND MONTH(order_date) = 1;
SELECT
order_date,
COUNT(*) AS order_count,
SUM(amount) AS daily_revenue
FROM orders
GROUP BY order_date
ORDER BY order_date;
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS order_count,
SUM(amount) AS monthly_revenue
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
SELECT
DAYOFWEEK(order_date) AS dow,
CASE DAYOFWEEK(order_date)
WHEN 1 THEN '์ผ'
WHEN 2 THEN '์'
WHEN 3 THEN 'ํ'
WHEN 4 THEN '์'
WHEN 5 THEN '๋ชฉ'
WHEN 6 THEN '๊ธ'
WHEN 7 THEN 'ํ '
END AS day_name,
COUNT(*) AS order_count
FROM orders
GROUP BY DAYOFWEEK(order_date)
ORDER BY dow;
SELECT
HOUR(order_time) AS hour,
COUNT(*) AS order_count
FROM orders
GROUP BY HOUR(order_time)
ORDER BY hour;
-- MySQL
SELECT STR_TO_DATE('2024-01-15', '%Y-%m-%d');
SELECT STR_TO_DATE('15/01/2024', '%d/%m/%Y');
-- BigQuery
SELECT PARSE_DATE('%Y-%m-%d', '2024-01-15');
-- MySQL
SELECT DATE_FORMAT(order_date, '%Y-%m-%d');
-- BigQuery
SELECT FORMAT_DATE('%Y-%m-%d', order_date);
-- TIMESTAMP โ DATE
SELECT DATE(order_time) AS order_date;
-- DATE โ TIMESTAMP
SELECT TIMESTAMP(order_date) AS order_ts;
์ ๋ต ๋ณด๊ธฐ2024๋ ์๋ณ ์ฃผ๋ฌธ ๊ฑด์์ ๋งค์ถ์ ๊ตฌํ์ธ์.
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS order_count,
SUM(amount) AS revenue
FROM orders
WHERE YEAR(order_date) = 2024
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
์ ๋ต ๋ณด๊ธฐ์ต๊ทผ 7์ผ๊ฐ ์ผ๋ณ ์ฃผ๋ฌธ ๊ฑด์๋ฅผ ๊ตฌํ์ธ์.
SELECT
order_date,
COUNT(*) AS order_count
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY order_date
ORDER BY order_date;
์ ๋ต ๋ณด๊ธฐ๊ฐ ์ ์ ์ ๊ฐ์ ์ผ๊ณผ ์ฒซ ์ฃผ๋ฌธ์ผ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฌ์ด ์ผ์๋ฅผ ๊ตฌํ์ธ์.
SELECT
u.user_id,
u.created_at AS signup_date,
MIN(o.order_date) AS first_order_date,
DATEDIFF(MIN(o.order_date), u.created_at) AS days_to_first_order
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id, u.created_at;
-- โ 2024-01-31 23:59:59 ๋ฐ์ดํฐ ๋๋ฝ ๊ฐ๋ฅ
WHERE order_time BETWEEN '2024-01-01' AND '2024-01-31'
-- โ
๋ค์ ๋ฌ ์ฒซ๋ ๋ฏธ๋ง์ผ๋ก
WHERE order_time >= '2024-01-01' AND order_time < '2024-02-01'
-- UTC๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ KST๋ก ๋ณํ
SELECT CONVERT_TZ(order_time, 'UTC', 'Asia/Seoul') AS kst_time;
-- โ ๋ฌธ์์ด ๋น๊ต (์์๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ)
WHERE order_date = '2024-1-5'
-- โ
์ ํํ ํฌ๋งท
WHERE order_date = '2024-01-05'
[์ถ์ถ]
YEAR(), MONTH(), DAY(), HOUR()
EXTRACT(part FROM date)
[ํฌ๋งท]
MySQL: DATE_FORMAT(date, '%Y-%m-%d')
BigQuery: FORMAT_DATE('%Y-%m-%d', date)
[์ฐ์ฐ]
DATE_ADD(date, INTERVAL n DAY/MONTH/YEAR)
DATE_SUB(date, INTERVAL n DAY)
DATEDIFF(date1, date2)
[ํํฐ๋ง]
WHERE date >= '์์' AND date < '๋'
WHERE YEAR(date) = 2024 AND MONTH(date) = 1
[SQL ์๋ฆฌ์ฆ #7] ๋ฌธ์์ด ํจ์ โ ๋ฐ์ดํฐ ์ ์ ์ ๊ธฐ๋ณธ
๐ ๋ ์ง ํจ์๋ ์ฝ๋ฉํ ์คํธ์ ๋จ๊ณจ ์ฃผ์ ๋ค.
DATE_FORMAT๊ณผ ๋ ์ง ์ฐ์ฐ๋ง ํ์คํ ์์๋ ๋๋ถ๋ถ์ ๋ฌธ์ ์ ๋์ ๊ฐ๋ฅ!