Perbedaannya tercakup dalam dokumentasi PostgreSQL untuk tipe tanggal/waktu. Ya, perlakuan TIME
atau TIMESTAMP
berbeda antara satu WITH TIME ZONE
atau WITHOUT TIME ZONE
. Itu tidak mempengaruhi bagaimana nilai disimpan; itu mempengaruhi bagaimana mereka ditafsirkan.
Efek zona waktu pada tipe data ini dibahas secara khusus dalam dokumen. Perbedaan muncul dari apa yang dapat diketahui secara wajar oleh sistem tentang nilainya:
-
Dengan zona waktu sebagai bagian dari nilai, nilai dapat dirender sebagai waktu lokal di klien.
-
Tanpa zona waktu sebagai bagian dari nilai, zona waktu default yang jelas adalah UTC, sehingga dirender untuk zona waktu tersebut.
Perilaku berbeda tergantung pada setidaknya tiga faktor:
- Pengaturan zona waktu di klien.
- Tipe data (yaitu
WITH TIME ZONE
atauWITHOUT TIME ZONE
) dari nilainya. - Apakah nilainya ditentukan dengan zona waktu tertentu.
Berikut adalah contoh yang mencakup kombinasi dari faktor-faktor tersebut:
foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+09
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 06:00:00+09
(1 row)
foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+11
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 08:00:00+11
(1 row)