[SQL] ๋ ์งํ ๋ฐ์ดํฐ - DATETIME๊ณผ TIMESTAMP ์ฐจ์ด๋ฅผ ์ค์ ์ผ๋ก (MySQL)
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์๋ก ์ฐ์ด๋ ๋ ์งํ ๋ฐ์ดํฐ์ ๋ํด ์ ๋ฆฌํด๋๊ณ ์ ํฉ๋๋ค.
4๊ฐ์ง ์ ํ์ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ ๋ฆฌ์ ์ผ์์ ์๊ฐ์ ๋ชจ๋ ํํํ๋ DATETIME๊ณผ TIMESTAMP์ ์ฐจ์ด๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
1. DATE, DATETIME, TIMESTAMP, TIME
MySQL์์๋ ์ผ์์ ์๊ฐ์ ํํํ๊ธฐ์ํด DATE, DATETIME, TIMESTAMP, TIME ํ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
DATE | DATETIME | TIMESTAMP | TIME | |
์์ธ | ์ผ์๋ง ํํ | - ์ผ์์ ์๊ฐ ํํ - ์ต๋ ๋ง์ดํฌ๋ก์ด ์ ๋ฐ๋์ ์์ ์ด๋ฅผ ํฌํจ ๊ฐ๋ฅ - ํ์ฌ ๋ ์ง์ ์๊ฐ์ผ๋ก ์๋ ์ด๊ธฐํ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅ |
- ์ผ์์ ์๊ฐ ํํ - (default) NOT NULL - Timezone ๊ธฐ๋ฐ - ์ต๋ ๋ง์ดํฌ๋ก์ด ์ ๋ฐ๋์ ์์ ์ด๋ฅผ ํฌํจ ๊ฐ๋ฅ - ํ์ฌ ๋ ์ง์ ์๊ฐ์ผ๋ก ์๋ ์ด๊ธฐํ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅ |
์๊ฐ๋ง ํํ |
ํ์ | YYYY-MM-DD | YYYY-MM-DD hh:mm:ss | YYYY-MM-DD hh:mm:ss | hh:mm:ss |
๋ฒ์ | '1000-01-01' ~'9999-12-31' |
'1000-01-01 00:00:00' ~ '9999-12-31 23:59:59' |
'1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC |
'-838:59:59' ~'838:59:59' |
์ฉ๋ | 3byte | 8byte | 4byte | 3byte |
์ผ์์ ์๊ฐ์ ๋ชจ๋ ํํํ๋ DATETIME๊ณผ TIMESTAMP๋ ์ผํ๋ด์๋ ๋น์ทํ๋ฐ, ์ฐจ์ด์ ์ด ์์ต๋๋ค.
์ด ๋์ ์ฐจ์ด๋ฅผ ์๊ณ ์์ด์ผ ์์์น ๋ชปํ ์๋ฌ์ฌํญ์ ๋๋นํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฐจ์ด์ ์ ํ ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
2. DATETIME vs TIMESTAMP
1) ๋ฒ์
์ผ์์ ์๊ฐ์ ๋ชจ๋ ํํํ๋ ๋ ํ์ ์ ์ผ๋จ ํ์์ ๋ณผ ์ ์๋ฏ ๋ฒ์์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
DATETIME์ ๋ฒ์๋ '1000-01-01 00:00:00' ๋ถํฐ '9999-12-31 23:59:59' ๋ก, ์๊ฐ๋์ ๊ด๊ณ์์ด ์ ๋์ ์ธ ์ผ์์ ์๊ฐ์ ์ ์ฅํฉ๋๋ค.
TIMESTAMP์ ๋ฒ์๋ '1970-01-01 00:00:01' UTC ๋ถํฐ '2038-01-19 03:14:07' UTC ๋ก, ๋ฐ์ดํฐ๊ฐ UTC๋ก ๋ณํ๋์ด ์ ์ฅ๋๋ฉฐ ๊ฒ์์ ํ์ฌ ์๊ฐ๋๋ก ๋ณํ์ด ๋ฉ๋๋ค. TIMESTAMP์ ๋ฒ์๋ Unix ์๊ฐ๊ณผ ๊ด๋ จ์ด ์์ด, 2038๋ ๋ฌธ์ ๋ก ์ธํด ์ต๋ ๋ฒ์๊ฐ 2038๋ ๊น์ง๋ก ์ ํ๋ฉ๋๋ค.
2) Timezone์ ์ ์ฉ ์ฌ๋ถ
๋ ํ์ ์ Timezone์ ์ ์ฉ ์ฌ๋ถ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
Timezone์ ๋์ผํ ์๊ฐ์ ๋ฐ๋ฅด๋ ์ง์ญ์ ์๋ฏธํ๊ณ , ํด๋น ๊ตญ๊ฐ์ ์ํด ๋ฒ์ ์ผ๋ก ์ง์ ๋๋ ๊ฐ์ ๋๋ค.
UTC, Asia/Seoul ๋ฑ์ ํ๊ธฐ๊ฐ ํด๋น ์๊ฐ์ด ์ด๋ค ๋ก์ปฌ์ ๊ธฐ์ค์ผ๋ก ์์ฑํ ๊ฒ์ธ์ง๋ฅผ ๋ช ์ํ๋ ๊ฒ์ ๋๋ค.
MySQL์ TIMESTAMP ๊ฐ์ ํ์ฌ ์๊ฐ๋์์ *UTC๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ณ , ๋ค์ UTC์์ ํ์ฌ ์๊ฐ๋๋ก ๋ณํํ์ฌ ๊ฒ์ํฉ๋๋ค.
*UTC: ๊ตญ์ ํ์ค์
๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋๋ ์๊ฐ๋๋ ์๋ฒ ์๊ฐ์ผ๋ก, ์๊ฐ๋ ์ค์ ์ด ์ผ์ ํ๊ฒ ์ ์ง๋๋ค๋ฉด ์ ์ฅํ ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ ๋ฐํ๋ฐ์ต๋๋ค.
๋ง์ฝ TIMESTAMP ๊ฐ์ ์ ์ฅํ ํ, ์๊ฐ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ฐ์ ์กฐํํ๋ฉด, ์กฐํ ๊ฒฐ๊ณผ๋ ์ ์ฅํ ๊ฐ๊ณผ ๋ค๋ฅด๊ฒ ๋ฉ๋๋ค. ์๊ฐ๋ ๋ณํ์ ๋์ผํ ์๊ฐ๋๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋๋ค.
*ํ ์๊ฐ๋๋ ์์คํ ๋ณ์์ธ time_zone ์ ์ค์ ๋ ๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
์์
์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ํ์ธํด๋ด ์๋ค.
create table date_example
(
test_date date,
test_datetime datetime,
test_timestamp timestamp,
test_time time
);
insert into date_example values (now(), now(), now(), now());
ํ ์คํธ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ํ์ฌ ์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ต๋๋ค.
mysql> select * from date_example;
+------------+---------------------+---------------------+-----------+
| test_date | test_datetime | test_timestamp | test_time |
+------------+---------------------+---------------------+-----------+
| 2024-07-09 | 2024-07-09 10:36:17 | 2024-07-09 10:36:17 | 10:36:17 |
+------------+---------------------+---------------------+-----------+
1 row in set (0.00 sec)
์ผ์ชฝ๋ถํฐ DATE, DATETIME, TIMESTAMP, TIME ํ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ time_zone์ ์์ ํด๋ณด๊ณ ๋ค์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
mysql> SET time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from date_example;
+------------+---------------------+---------------------+-----------+
| test_date | test_datetime | test_timestamp | test_time |
+------------+---------------------+---------------------+-----------+
| 2024-07-09 | 2024-07-09 10:36:17 | 2024-07-09 02:36:17 | 10:36:17 |
+------------+---------------------+---------------------+-----------+
1 row in set (0.00 sec)
time_zone์ ๋ณํ๋ฅผ ์ฃผ๊ณ ์กฐํํด๋ณด๋ TIMESTAMP ํ์์ test_timstamp ๊ฐ๋ง ๋ณํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
- SET time_zone = '+01:00' : UTC+09:00 ๋ณด๋ค 8์๊ฐ ์ด์ ์ผ๋ก ์ค์
์ด๋ ์์์ ๊ธฐ์ฌํ๋ฏ TIMESTAMP ๋ ์์คํ ๋ณ์์ธ time_zone์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๊ธฐ๋๋ฌธ์ TIMESTAMP๋ฅผ ์ฌ์ฉํ๊ณ , ๋ก์ปฌ ์๊ฐ์ด ๋ค๋ฅธ ๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ์ด์ํ ๋์๋ ์ด๋ฅผ ์ ์ํด์ ๊ด๋ฆฌํด์ผํฉ๋๋ค.
TIMESTAMP๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ์๊ฐ์ ๋ฐ๋ผ ํผ๋์ด ์์ ์๋ ์์ผ๋, ๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ์ด์ํ ๋์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์์ต๋๋ค.
๋ง์ฝ DATETIME์ ์ฌ์ฉํ๋ค๋ฉด ๋ก์ปฌ ์๊ฐ์ด ์ ๋๋ก ๋ฐ์๋์ง ์์์, ์์ธ์์ ์ค์ 11์์ ์์ฑํ ๊ธ์ ๋ฏธ๊ตญ์์ ์กฐํํ๋ ๊ฒฝ์ฐ, ๋์ผํ๊ฒ ์ค์ 11์๋ก ๋ฐ์๋๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๊ฒ ์๊ฐ์ด ๋ค๋ฅธ ์ง์ญ์ด ์๋ ๊ฒฝ์ฐ, TIMESTAMP๊ฐ ๋ ์ ํฉํ ์๋ ์์ต๋๋ค.
์ด๋ฌํ ํน์ง๋ค๋ก DATETIME์ ์ ๋์ ์ธ ์๊ฐ ๊ธฐ๋ก์ ์ ํฉํ๊ณ TIMESTAMP๋ ์๊ฐ๋์ ๋ฐ๋ผ ๋ณํ์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฐ์ ๋๋ค.
3) DATETIME ๊ณผ TIMESTAMP์ ์๋ ์ด๊ธฐํ
DATETIME์ TIMESTAMP๋ ํ์ฌ ์ผ์์ ์๊ฐ์ ๊ธฐ๋ณธ๊ฐ, ์๋ ์ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ์๋ ์ด๊ธฐํ: ๋ฐ์ดํฐ ์ฝ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์๋ ํ์ฌ ํ์์คํฌํ๋ก ์ค์
- ์๋ ์ ๋ฐ์ดํธ: ๋ฐ์ดํฐ ๊ฐฑ์ ์ ์๋์ผ๋ก ํ์ฌ ํ์ ์คํฌํ๋ก ๊ฐฑ์
์ค์ ๋ฐฉ๋ฒ
์๋ ์ด๊ธฐํ์ ์ ๋ฐ์ดํธ๋ฅผ ์ค์ ํ๋ ค๋ฉด DATETIME๊ณผ TIMESTAMP ์ด ์ ์์์ ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
- ์๋ ์ด๊ธฐํ๋ฅผ ์ํ ์ด๊ธฐ๊ฐ ์ค์ : DEFAULT ~~
- ์๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ค์ : ON UPDATE ~~
DATETIME๊ณผ TIMESTAMP๋ฅผ ๊ฐ๊ฐ ํ์์ผ๋ก ๊ฐ์ง๋ column์ด ์๋ ํ ์ด๋ธ์ ์๋์ ๊ฐ์ด ์ ์ํ๋ฉด ์๋์ผ๋ก ๊ฐ์ด ๋ค์ด๊ฐ๋๋ค.
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
์ ํ ์ด๋ธ์ ์๋ฌด ๊ฐ๋ ์ง์ ํ์ง ์๊ณ INSERT๋ฅผ ํ๊ณ ์กฐํ๋ฅผ ํ๋ฉด,
insert into t1 values();
์๋ฌด ๊ฐ๋ ๋ฃ์ง ์์๋๋ฐ๋ ํ์ฌ ์๊ฐ์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
mysql> select * from t1;
+---------------------+---------------------+
| ts | dt |
+---------------------+---------------------+
| 2024-07-09 12:13:49 | 2024-07-09 12:13:49 |
+---------------------+---------------------+
1 row in set (0.00 sec)
์ด๋ฒ์ ์๋์ ๊ฐ์ ํ ์ด๋ธ์ ์์ฑํด๋ด ์๋ค.
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
);
์์์ ์ ์ํ ๊ฒ๊ณผ ๋ค๋ฅธ์ ์ DEFAULT NULL ๋ถ๋ถ์ ๋๋ค.
์ด๋ ๊ธฐ๋ณธ๊ฐ์ NULL๋ก ๋๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
mysql> INSERT INTO t1 VALUES();
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM T1;
+------+------+
| ts | dt |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)
์์ ๋์ผํ๊ฒ ์๋ฌด ๊ฐ๋ ๋ฃ์ง ์๊ณ INSERT๋ฅผ ํ๋ฉด, ์ด๋ฒ์๋ NULL ๊ฐ์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ,
์๋น์ค๋ฅผ ์ด์ํ๋ฉด ํ์์ ์ผ๋ก ํฌํจ๋๋ ๋ ์ง์ ์๊ฐ ๋ฐ์ดํฐํ์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ์ต๋๋ค.
ํนํ DATETIME๊ณผ TIMESTAMP์ ์ฐจ์ด์์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์๋๋ฐ, ์ด๋ฒ์ ์ ๋ฆฌํ๊ณ ์ฐพ์๋ณด๋ฉด์ ํ๋ฒ ๋ ํ์ธํ ์ ์์๋ ์๊ฐ์ด์์ต๋๋ค. ๋ ์ง ๋ฐ์ดํฐ์ ๊ด๋ จํด์๋ ๋ค์์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๋ฑ ์ค์ ๋ก ๊ฐ์ ์กฐํํ๊ณ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
Reference
MySQL :: MySQL 8.4 Reference Manual :: 13.2.2 The DATE, DATETIME, and TIMESTAMP Types
13.2.2 The DATE, DATETIME, and TIMESTAMP Types The DATE, DATETIME, and TIMESTAMP types are related. This section describes their characteristics, how they are similar, and how they differ. MySQL recognizes DATE, DATETIME, and TIMESTAMP values in several f
dev.mysql.com
MySQL :: MySQL 8.4 Reference Manual :: 13.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME
13.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME TIMESTAMP and DATETIME columns can be automatically initialized and updated to the current date and time (that is, the current timestamp). For any TIMESTAMP or DATETIME column in a ta
dev.mysql.com