Saya memiliki kolom TIMESTAMP WITHOUT TIME ZONE
jenis dan ingin memiliki default ke waktu saat ini di UTC. Mendapatkan waktu saat ini di UTC mudah:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Seperti menggunakan cap waktu saat ini untuk sebuah kolom:
postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
ts
----------------------------
2013-05-17 14:54:33.072725
(1 row)
Tapi itu menggunakan waktu setempat. Mencoba memaksakan hal itu kepada UTC menghasilkan kesalahan sintaksis:
postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR: syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
postgresql
timezone
timestamp
Wichert Akkerman
sumber
sumber
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
gagal dengan:ERROR: column "UTC" does not exist
. Pastikan'utc'
semua huruf kecil.'utc'
String juga harus memiliki tanda kutip tunggal, bukan tanda kutip ganda.Masih solusi lain:
sumber
Bungkus dalam suatu fungsi:
sumber
Bagaimana dengan
Jika cap waktu Anda yang lain tanpa zona waktu maka pemeran ini akan menghasilkan jenis pencocokan "cap waktu tanpa zona waktu" untuk waktu saat ini.
Saya ingin membaca pendapat orang lain tentang opsi itu. Saya masih tidak percaya pada pemahaman saya tentang hal-hal "dengan / tanpa" zona waktu ini.
EDIT: Menambahkan komentar Michael Ekoka di sini karena itu mengklarifikasi poin penting:
sumber
Ini adalah 2 solusi yang setara:
(dalam kode berikut, Anda harus mengganti
'UTC'
untuk zona dannow()
untuk timestamp )timestamp AT TIME ZONE zone
- SQL-standar-sesuaitimezone(zone, timestamp)
- bisa dibilang lebih mudah dibacaPenjelasan:
'UTC'
) atau sebagai interval (misalnya,INTERVAL '-08:00'
) - di sini adalah daftar semua zona waktu yang tersedianow()
mengembalikan nilai jenis cap waktu (hanya yang kami butuhkan) dengan zona waktu default database Anda terlampir (mis2018-11-11T12:07:22.3+05:00
.).timezone('UTC', now())
Ternyata waktu saat kami (tipe timestamp dengan zona waktu ) menjadi setara timezonless diUTC
.Misalnya,
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
akan kembali2020-03-16T20:00:00Z
.Documents: zona waktu ()
sumber
at timezone 'utc'
dan itu tidak berfungsi dengan pengaturan PostgreSQL saya. Menggunakan huruf besar memecahkan masalahFungsi sudah ada: zona waktu ('UTC' :: teks, sekarang ())
sumber