Berkat resolusi jenis fungsi kami juga dapat melewati date
nilai ke generate_series()
karena ada implisit dilemparkan dari date
ke timestamp
serta dari date
ke timestamptz
. Akan ambigu, tetapi timestamptz
adalah "lebih disukai" di antara "Jenis tanggal/waktu". Penjelasan detail:
- Membuat deret waktu antara dua tanggal di PostgreSQL
Untuk date
telanjang waktu setempat 00:00
diasumsikan dalam pemeran. Ketahuilah bahwa pengaturan zona waktu saat ini secara langsung memengaruhi hasil jika Anda menggunakan date
sebagai masukan karena, jelas, '2014-01-10 00:00' mewakili titik waktu yang berbeda di Tokio daripada di New York.
Bagaimana Postgres memutuskan jenis apa yang dapat diterima?
Postgres pada dasarnya membedakan antara tiga jenis pemeran:
Explicit casts
.. saat menggunakan CAST
atau ::
sintaks.Assignment cast
.. pemeran implisit saat nilai ditetapkan ke kolom target.Implicit cast
.. pemeran implisit dalam semua ekspresi lainnya.
Harus ada implisit cast terdaftar di sistem dari tipe input ke tipe yang diharapkan untuk membuat fungsi menerima (dan mengonversi) nilai input secara diam-diam.
Untuk melihat pemeran mana yang ditentukan untuk timestamp
, Anda dapat menanyakan tabel katalog pg_cast
:
SELECT castsource::regtype, casttarget::regtype, castcontext
FROM pg_cast
WHERE casttarget = 'timestamptz'::regtype;
castsource | casttarget | castcontext
-----------------------------+--------------------------+-------------
abstime | timestamp with time zone | i
date | timestamp with time zone | i
timestamp without time zone | timestamp with time zone | i
timestamp with time zone | timestamp with time zone | i
Semua pemeran ini implisit . Per dokumentasi di castcontext
:
Menunjukkan dalam konteks apa pemeran dapat dipanggil.
e
berarti hanya sebagai pemeran eksplisit (menggunakanCAST
atau::
sintaksis).a
berarti penugasan secara implisit ke kolom target, serta secara eksplisit.i
berarti secara implisit dalam ekspresi, serta kasus lainnya.
Penekanan saya yang berani.