[PostgreSQL] ํ์์กด
PostgreSQL์ ํ์์กด์ ์์ฒด์ ์ผ๋ก ์ด๋ ์ ๋ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ๋ ํ์์กด์ show tinmezone ๋ช ๋ น์ด๋ก ์กฐํํ ์ ์๋ค.
์ด๊ฒ ๋ณดํต ์ค์นํ ๋ OS ํ๊ฒฝ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ํ์ฌ์์ ์ ๊ณตํ๋ DB๋ฅผ ์ด๋ค๋ฉด UTC๋ก ์ ์ฅ๋์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ์ค์ ๋ก๋ ๊ทธ๊ฒ ๊ตญ๋ฃฐ์ด๋ค.
๊ตญ๊ฐ๋ณ ์๊ฐ์ ์ฒ๋ฆฌํ ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ถ์ฅ์ฌํญ์ UTC๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ๊ทธ๊ฑธ ํด๋ผ์ด์ธํธ์์ ๋ณํํด์ ํํํ๋ ๊ฒ์ด๋ค.
๋จ์ ์กฐํ ์์ค์์ ๊ฐ๋ฅํ๋ค๋ฉด ํ๋ก ํธ์๋ ์์ค์์ ํ์์กด์ ๊ณ์ฐํ๋ฉด ๋๊ณ , ๋ด๋ถ ๋ก์ง์์ ํน์ ๊ตญ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ ์ง ๊ณ์ฐ์ ํ๋ค๊ฑฐ๋ ํ๋ฉด ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์ค์์ ํ์์กด์ ๋ํด์ ๊ณ์ฐํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
ํ์์กด ๋ณํ
PostgreSQL์ ์์ฒด์ ์ธ ํ์์กด ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์๊ฐ ๊ฐ ์ค๋ฅธํธ์** at time zone '์๊ฐ๋' **ํํ์ ์ง์ด๋ฃ์ผ๋ฉด ๋๋ค.
๊ทธ๋ผ ํด๋น ์๊ฐ๋์ ๋ง๊ฒ ๋ณํ์ ์ํํด์ค ๊ฒ์ด๋ค.
TIMESTAMP์ TIMESTAMPTZ
PostgreSQL์์ ์๊ฐ์ ๋ค๋ฃจ๋ค๋ณด๋ฉด ๊ฐ์ฅ ์คํดํ๊ธฐ ์ฌ์ด๊ฒ ์ด 2๊ฐ์ง ํ์
์ด๋ค.
์ด 2๊ฐ์ง๋ ์ผ์+์๊ฐ์ ํฉํด์ ๊ด๋ฆฌํ๋ 8๋ฐ์ดํธ ์๊ฐ ํ์
์ด๋ค.
๊ทผ๋ฐ ์ฌ์ค, ์ด 2๊ฐ์ ํ์
์ ๋ณธ์ง์ ์ผ๋ก ๋ค๋ฅด์ง ์๋ค.
๋ ๋ค 8๋ฐ์ดํธ์ง๋ฆฌ ๋ฐ์ดํฐ ํ์
์ด๊ณ , TIMESTAMPTZ๋ผ๊ณ ํด์ ํ์์กด์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฒ๋ ์๋๋ค.
์ฐจ์ด๊ฐ ์๋ค๋ฉด, timestamp๋ ์๊ฐ์ ๋ฐ์์ ์ ์ฅํ ๋ ๋ฌด์ํ๊ฒ ๋๋ ค๋ฃ๋๋ค๋ ๊ฒ์ด๊ณ , timestamptz๋ ์๊ฐ์ ๋ฐ์์๋ ํ์์กด์ ๊ณ ๋ คํด์ UTC๋ก ๋ณํํ ์ฑ๋ก ๋ฃ๋๋ค๋ ๊ฒ์ด๋ค.
์๋๋ ๊ทธ ๋์์ ํ์ธํ ์ ์๋ ๊ฐ๋จํ ์์ ์ฟผ๋ฆฌ๋ค.
์์๋ณด๊ธฐ ์ฝ๋๋ก UTC๋ก ํ์์กด์ ๊ณ ์ ํ๊ณ ๋๋ ค๋ดค๋ค.

set time zone 'UTC';
SELECT
'2021-01-01 00:00:00 +03:00'::timestamp as a,
'2021-01-01 00:00:00 +03:00'::timestamptz as b;
timestamp๋ก ๋ณํํ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ์๊ฐ์ ๋ฌด์ํ๊ฒ ๋ณํํด์ ๋ฃ์๋ค. ๊ทธ๋์ ์ฌ์ค ์ค์ ๋ก UTC ๊ธฐ์ค์ผ๋ก๋ 3์๊ฐ์ ๋นผ์ ์ ์ฅํด์ผ ํจ์๋ ์ง์ญ๋ณ ์๊ฐ์ด ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
timestamptz๋ก ๋ณํํ ๊ฒฝ์ฐ์๋ ์ค๋ฅธ์ชฝ์ ๋ถ์ offset-ํ์์กด ์ ๋ณด๋ฅผ ๊ณ ๋ คํด์ 3์๊ฐ์ ๋นผ๊ณ , UTC ๊ธฐ์ค์ผ๋ก ๊ฐ์ ๋ณํํ๋ค.
์ด๋ฐ ์ค๋ฌํ ๋์ ํ์ timestamp๋ ์๊ฐ๋์ ๊ด๋ จํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ๋ค.
๊ทธ๋์ ๊ฐ๊ธ์ ์ด๋ฉด timestamp๋ ์๋ค๊ณ ์๊ฐํ๊ณ timestamptz์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค. ๋๋ค์ ORM๋ค์์๋ ์๊ฐ ํ๋๋ฅผ ์์ฑํ ๋ timestamptz๋ฅผ ๊ธฐ๋ณธ ์ต์
์ผ๋ก ์ฌ์ฉํ๋ค.