Saya sedang mengerjakan desain DB PostgreSQL dan saya bertanya-tanya bagaimana cara terbaik untuk menyimpan cap waktu.
Asumsi
Pengguna di zona waktu yang berbeda akan menggunakan database untuk semua fungsi CRUD.
Saya telah melihat 2 opsi:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Karena timestamp
saya akan mengirim string yang akan mewakili cap waktu yang tepat (UTC) untuk momen INSERT.
Karena bigint
aku akan menyimpan hal yang sama persis, tetapi dalam format angka. (masalah zona waktu ditangani sebelum millis diserahkan ke server, jadi selalu millis dalam UTC.)
Satu keuntungan utama dengan menyimpan a bigint
adalah bahwa akan lebih mudah untuk menyimpan dan mengambil, karena melewati cap waktu yang diformat dengan benar lebih kompleks daripada angka sederhana (milis sejak Unix Epoc).
Pertanyaan saya adalah mana yang akan memungkinkan untuk desain yang paling fleksibel dan apa yang bisa menjadi jebakan dari setiap pendekatan.
Jawaban:
Simpan cap waktu sebagai
timestamp
, atau lebih tepatnyatimestamptz
(timestamp with time zone
) karena Anda berhadapan dengan beberapa zona waktu . Itu memberlakukan data yang valid dan biasanya paling efisien. Pastikan untuk memahami tipe data, ada beberapa kesalahpahaman yang beredar:Untuk mengatasi masalah Anda:
Anda dapat melewati dan mengambil zaman UNIX dengan cara lain jika Anda menginginkan:
Terkait:
Jika Anda ingin menyimpan cap waktu saat ini dengan write ke DB, gunakan
timestamptz
kolom dengan nilai defaultnow()
. Waktu sistem pada server DB biasanya jauh lebih andal dan konsisten daripada banyak klien yang memberikan pendapat masing-masing tentang jam berapa sekarang.Untuk
INSERT
itu bisa sesederhana:Dan jangan menulis ke kolom itu. Itu diisi secara otomatis.
sumber
Anda harus selalu menyimpan data dalam datatype asli sehingga Anda dapat menggunakan fungsi bawaan. Dan tipe data cap waktu jelas a
timestamp
.Btw, sebuah
timestamp
tersebut tidak disimpan sebagai string, itu disimpan sebagai integer 8-byte, persis sama denganbigint
: dokumentasi PostgreSQL .sumber