6. SQL - datetime

Jasonยท2026๋…„ 1์›” 12์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
6/47




SQL ๋‚ ์งœ/์‹œ๊ฐ„ ํ•จ์ˆ˜ โ€” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•„์ˆ˜ ์ •๋ฆฌ

๐Ÿ’ก ์ฝ”ํ…Œ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ํ•จ์ˆ˜๋ฅผ ์™„๋ฒฝ ์ •๋ฆฌํ•œ๋‹ค.


๐Ÿค” ์™œ ์ค‘์š”ํ•ด?

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ ์œ ํ˜•:

  • "2024๋…„ 1์›”์— ๊ฐ€์ž…ํ•œ ์œ ์ €"
  • "์ตœ๊ทผ 7์ผ๊ฐ„ ์ฃผ๋ฌธ"
  • "์›”๋ณ„ ๋งค์ถœ ์ง‘๊ณ„"
  • "์š”์ผ๋ณ„ ํŠธ๋ž˜ํ”ฝ"

โ†’ ๋‚ ์งœ ํ•จ์ˆ˜ ๋ชจ๋ฅด๋ฉด ๋ชป ํ‘ธ๋Š” ๋ฌธ์ œ ๋งŽ์Œ!


๐Ÿ“Š ์˜ˆ์ œ ํ…Œ์ด๋ธ”

[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 |


๐Ÿ—“๏ธ DB๋ณ„ ๋ฌธ๋ฒ• ์ฐจ์ด

๊ธฐ๋ŠฅMySQLPostgreSQLBigQuery
ํ˜„์žฌ ๋‚ ์งœCURDATE()CURRENT_DATECURRENT_DATE()
ํ˜„์žฌ ์‹œ๊ฐ„NOW()NOW()CURRENT_TIMESTAMP()
๋‚ ์งœ ํฌ๋งทDATE_FORMAT()TO_CHAR()FORMAT_DATE()
๋‚ ์งœ ์ถ”์ถœYEAR(), MONTH()EXTRACT()EXTRACT()
๋‚ ์งœ ์—ฐ์‚ฐDATE_ADD()+ INTERVALDATE_ADD()

1๏ธโƒฃ ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„

MySQL

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

PostgreSQL

SELECT 
    CURRENT_DATE AS today,
    NOW() AS now,
    CURRENT_TIMESTAMP AS ts;

BigQuery

SELECT 
    CURRENT_DATE() AS today,
    CURRENT_TIMESTAMP() AS now;

2๏ธโƒฃ ๋‚ ์งœ ๋ถ€๋ถ„ ์ถ”์ถœ

MySQL - ๊ฐœ๋ณ„ ํ•จ์ˆ˜

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;

MySQL - EXTRACT

SELECT 
    EXTRACT(YEAR FROM order_date) AS year,
    EXTRACT(MONTH FROM order_date) AS month,
    EXTRACT(DAY FROM order_date) AS day
FROM orders;

BigQuery - EXTRACT

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;

3๏ธโƒฃ ๋‚ ์งœ ํฌ๋งทํŒ…

MySQL - DATE_FORMAT

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(ํ† ) |

PostgreSQL - TO_CHAR

SELECT 
    TO_CHAR(order_date, 'YYYY-MM') AS ym,
    TO_CHAR(order_date, 'YYYY-MM-DD') AS ymd
FROM orders;

BigQuery - FORMAT_DATE

SELECT 
    FORMAT_DATE('%Y-%m', order_date) AS ym,
    FORMAT_DATE('%Y-%m-%d', order_date) AS ymd
FROM orders;

4๏ธโƒฃ ๋‚ ์งœ ์—ฐ์‚ฐ

MySQL

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;

BigQuery

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;

5๏ธโƒฃ ๋‚ ์งœ ๋ฒ”์œ„ ํ•„ํ„ฐ๋ง

ํŠน์ • ๊ธฐ๊ฐ„

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

์ตœ๊ทผ N์ผ

-- ์ตœ๊ทผ 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;

6๏ธโƒฃ ๋‚ ์งœ๋ณ„ ์ง‘๊ณ„

์ผ๋ณ„

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;

7๏ธโƒฃ ๋‚ ์งœ ๋ณ€ํ™˜

๋ฌธ์ž์—ด โ†’ ๋‚ ์งœ

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

-- TIMESTAMP โ†’ DATE
SELECT DATE(order_time) AS order_date;

-- DATE โ†’ TIMESTAMP
SELECT TIMESTAMP(order_date) AS order_ts;

๐ŸŽฏ ์‹ค์ „ ๋ฌธ์ œ

๋ฌธ์ œ 1: ์›”๋ณ„ ์ง‘๊ณ„

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;

๋ฌธ์ œ 2: ์ตœ๊ทผ 7์ผ

์ตœ๊ทผ 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;

๋ฌธ์ œ 3: ๊ฐ€์ž… ํ›„ ์ฒซ ์ฃผ๋ฌธ

๊ฐ ์œ ์ €์˜ ๊ฐ€์ž…์ผ๊ณผ ์ฒซ ์ฃผ๋ฌธ์ผ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‚ฌ์ด ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.

์ •๋‹ต ๋ณด๊ธฐ
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;

๐Ÿ’ก ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜

1. BETWEEN์˜ ๊ฒฝ๊ณ„๊ฐ’

-- โŒ 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'

2. ์‹œ๊ฐ„๋Œ€(Timezone) ๊ณ ๋ ค

-- UTC๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ KST๋กœ ๋ณ€ํ™˜
SELECT CONVERT_TZ(order_time, 'UTC', 'Asia/Seoul') AS kst_time;

3. ๋ฌธ์ž์—ด ๋น„๊ต ์ฃผ์˜

-- โŒ ๋ฌธ์ž์—ด ๋น„๊ต (์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ)
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๊ณผ ๋‚ ์งœ ์—ฐ์‚ฐ๋งŒ ํ™•์‹คํžˆ ์•Œ์•„๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ์— ๋Œ€์‘ ๊ฐ€๋Šฅ!

profile
Data Analyst | Thoughts Become Things. ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์—†๋‹ค. | www.linkedin.com/in/๋ช…์ˆ˜-์ œ-7ab843200

0๊ฐœ์˜ ๋Œ“๊ธ€