PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Stempel Waktu Postgres

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 apakah event 1 sebelum event 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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan dua perbedaan bidang datetime dalam hari dan jam dalam tampilan postgresql?

  2. Konsep Oracle Ketersediaan Tinggi di PostgreSQL

  3. Permintaan mentah rel untuk format csv, untuk dikembalikan melalui pengontrol

  4. Presisi stempel waktu JOOQ pada kueri

  5. Apa yang terjadi dengan NpgsqlCopySerialize dan NpgsqlCopyIn