Representasi string dari timestamp
(=timestamp without time zone
) tergantung pada pengaturan lokal Anda. Oleh karena itu, untuk menghindari ambiguitas yang menyebabkan kesalahan data atau Postgres mengeluarkan pengecualian, Anda memiliki dua opsi:
1.) Gunakan format ISO 8601 , yang berfungsi sama dengan apa saja lokal atau DateStyle
pengaturan:
'2013-08-20 14:52:49'
Anda mungkin harus mentransmisikan string literal secara eksplisit di mana tipe data tidak dapat diturunkan dari konteks, tergantung pada kasus penggunaan:
'2013-08-20 14:52:49'::timestamp
2.) Ubah string menjadi timestamp
menggunakan to_timestamp()
dengan pola template yang cocok:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')
Ini mengembalikan timestamptz
, dengan asumsi pengaturan zona waktu saat ini. Biasanya (seperti dalam penugasan) tipenya dipaksakan. Untuk timestamp
, ini berarti offset waktu terpotong dan Anda mendapatkan nilai yang diharapkan. Sekali lagi, jika jenis target tidak dapat diturunkan dari konteks, Anda mungkin harus mentransmisikan secara eksplisit:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp
Karena itu hanya menghapus offset waktu, itu menghasilkan nilai yang diharapkan. Atau gunakan AT TIME ZONE
membangun dengan zona waktu yang Anda pilih:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'
Sementara zona waktu target sama dengan timezone
Anda saat ini pengaturan, tidak ada transformasi yang terjadi. Jika tidak, stempel waktu yang dihasilkan akan diubah sesuai dengan itu. Bacaan lebih lanjut:
- Mengabaikan zona waktu sama sekali di Rails dan PostgreSQL