0Pricing
SQL Academy · Pelajaran

Zona Waktu: TIMESTAMP vs TIMESTAMPTZ

Pahami perbedaan antara TIMESTAMP dan TIMESTAMPTZ, konversikan dengan AT TIME ZONE, dan simpan UTC agar aplikasi mudah dipindahkan.

Zona Waktu: TIMESTAMP vs TIMESTAMPTZ adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Dua Tipe Timestamp

PostgreSQL memiliki TWO tipe timestamp:

  • TIMESTAMP — timestamp "naif", tanpa informasi zona
  • TIMESTAMPTZ — timestamp dengan zona waktu (disimpan secara internal sebagai UTC)

Aturan praktis: pilih TIMESTAMPTZ untuk peristiwa; TIMESTAMP untuk waktu yang sepenuhnya abstrak seperti "pukul 9:00 AM untuk jam operasional".

Cara Kerja TIMESTAMPTZ

Secara internal selalu disimpan sebagai UTC. Saat INSERT, input Anda dikonversi dari TZ sesi ke UTC. Saat SELECT, output dikonversi kembali ke TZ sesi.

SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)

SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00

TIMESTAMP Kehilangan Informasi

TIMESTAMP biasa tidak mengetahui zonanya. "2024-03-15 12:00:00" dapat berarti waktu lokal apa pun. Saat pengguna berpindah zona, maknanya hilang.

AT TIME ZONE

Konversikan antar-zona untuk tampilan:

SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo'        AS tokyo_time FROM events;

Menyimpan UTC dan Menampilkan Waktu Lokal

Praktik terbaik: simpan TIMESTAMPTZ, konversikan ke zona pengguna dalam SELECT, jangan lakukan sebaliknya.

SELECT id,
       ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;

ZONA WAKTU SESI

Anda dapat mengaturnya per sesi, per pengguna, atau secara global:

-- Session:
SET TIME ZONE 'Europe/Berlin';

-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';

-- Server default in postgresql.conf:
-- timezone = 'UTC'

SUPPLY ZONE WITH LITERAL

Sertakan zona dalam literal:

SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;

NOW() Mengembalikan TIMESTAMPTZ

NOW(), CURRENT_TIMESTAMP selalu mengembalikan TIMESTAMPTZ. Mencampurnya dengan kolom TIMESTAMP adalah kesalahan umum.

Kapan TIMESTAMP (tanpa zona) Tepat Digunakan

Untuk waktu abstrak atau lokal yang benar-benar tidak bergantung pada zona — "toko buka pukul 09:00" — gunakan TIMESTAMP (atau TIME).

CREATE TABLE store_hours (
  store_id BIGINT,
  open_at  TIME NOT NULL,
  close_at TIME NOT NULL
);

Transisi DST

TIMESTAMPTZ menangani DST secara otomatis. Menambahkan INTERVAL bekerja berdasarkan jam dinding kecuali Anda melewati batas DST — saat itu waktunya dapat bergeser 23 atau 25 jam.

SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31

Jangan Simpan Offset, Simpan Nama Zona

Offset seperti +02:00 tidak memberi tahu Anda kapan DST dimulai. Nama zona seperti Europe/Berlin memberitahukannya. Saat menyimpan zona asal pengguna, simpan nama IANA.

Ringkasan

Gunakan TIMESTAMPTZ sebagai pilihan bawaan untuk peristiwa.

  • Disimpan sebagai UTC, ditampilkan dalam TZ sesi
  • Konversikan untuk tampilan dengan AT TIME ZONE
  • Gunakan TIMESTAMP (tanpa zona) hanya untuk waktu lokal abstrak

Pemeriksaan Singkat

Anda sedang membuat SaaS global yang mencatat peristiwa pengguna. Tipe timestamp apa yang harus digunakan untuk kolom occurred_at?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Zona Waktu: TIMESTAMP vs TIMESTAMPTZ” gratis?

Ya — teks lengkap “Zona Waktu: TIMESTAMP vs TIMESTAMPTZ” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Zona Waktu: TIMESTAMP vs TIMESTAMPTZ”?

Pahami perbedaan antara TIMESTAMP dan TIMESTAMPTZ, konversikan dengan AT TIME ZONE, dan simpan UTC agar aplikasi mudah dipindahkan. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Zona Waktu: TIMESTAMP vs TIMESTAMPTZ” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Aritmetika Tanggal dan INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Zona Waktu: TIMESTAMP vs TIMESTAMPTZ
  4. Laporan Tanggal Umum (MTD, WoW, YoY)
← Kembali ke SQL Academy