Tidak ada solusi antipeluru di sini.
Saran pertama saya:jangan pernah mengandalkan zona waktu default server.
Saran kedua saya:pilih antara timestamp
-timestamptz
sesuai dengan semantik (dominan) data.
Lebih detail:PostgresSQL memiliki dua varian stempel waktu, yang secara membingungkan diberi nama TIMESTAMP WITHOUT TIMEZONE (timestamp)
dan TIMESTAMP WITH TIMEZONE (timestamptz)
. Sebenarnya, tidak keduanya menyimpan zona waktu, atau bahkan offset. Kedua tipe data menempati lebar yang sama (4 byte), dan perbedaannya tidak kentara - dan, lebih buruk, dapat menggigit Anda jika Anda tidak sepenuhnya memahaminya dan server Anda mengubah zona waktu. Aturan kewarasan saya adalah:
-
Gunakan
TIMESTAMP WITH TIMEZONE (timestamptz)
untuk menyimpan acara yang sebagian besar terkait dengan waktu "fisik" , yang terutama ingin Anda tanyakan apakahevent 1
sebelumevent 2
(terlepas dari zona waktu), atau menghitung interval waktu (dalam "satuan fisik", misalnya, detik; bukan dalam satuan "sipil" sebagai hari-bulan, dll). Contoh tipikal adalah waktu pembuatan/modifikasi catatan - yang biasanya dimaksud dengan kata "Stempel waktu ". -
Gunakan
TIMESTAMP WITHOUT TIMEZONE (timestamp)
untuk menyimpan acara yang informasi relevannya adalah "waktu sipil" (yaitu, bidang{year-month-day hour-min-sec}
secara keseluruhan), dan kueri melibatkan perhitungan kalender. Dalam hal ini, Anda akan menyimpan di sini hanya "waktu lokal", yaitu, tanggal-waktu relatif terhadap beberapa zona waktu yang tidak ditentukan (tidak relevan, atau tersirat, atau disimpan di tempat lain).
Opsi kedua membuat Anda lebih mudah untuk membuat kueri, misalnya, "semua peristiwa yang terjadi pada hari '2013-01-20'" (di setiap wilayah/negara/zona waktu yang sesuai) - tetapi mempersulit kueri untuk "semua peristiwa yang terjadi (secara fisik) sebelum peristiwa referensi" (kecuali kita tahu mereka berada di zona waktu yang sama). Anda memilih.
Jika Anda membutuhkan semuanya, keduanya tidak cukup, Anda perlu menyimpan zona waktu atau offset di bidang tambahan. Opsi lain, yang menghabiskan beberapa byte tetapi dapat lebih efisien untuk kueri adalah menyimpan kedua bidang.
Lihat juga jawaban ini .