Anda dapat menulis fungsi to_date() Anda sendiri, tetapi Anda harus memanggilnya dengan nama yang memenuhi syarat skema. (Saya menggunakan skema "publik", tetapi tidak ada yang istimewa tentang itu.)
create or replace function public.to_date(any_date text, format_string text)
returns date as
$$
select to_date((any_date::date)::text, format_string);
$$
language sql
Menggunakan nama fungsi telanjang akan mengeksekusi fungsi asli to_date().
select to_date('20130229', 'yyyymmdd');
2013-03-01
Menggunakan nama yang memenuhi syarat skema menjalankan fungsi yang ditentukan pengguna.
select public.to_date('20130229', 'yyyymmdd');
ERROR: date/time field value out of range: "20130229"
SQL state: 22008
Saya tahu bukan itu yang Anda cari. Tetapi . . .
- Ini lebih sederhana daripada membangun kembali PostgreSQL dari sumber.
- Memperbaiki kode sumber SQL dan PLPGSQL yang ada adalah pencarian dan penggantian sederhana dengan editor streaming. Saya cukup yakin itu tidak akan salah, selama Anda benar-benar mau setiap penggunaan to_date() asli menjadi public.to_date().
- Fungsi asli to_date() akan tetap berfungsi seperti yang dirancang. Ekstensi dan kode lain mungkin bergantung pada perilakunya yang agak aneh. Berpikir keras dan jauh sebelum Anda mengubah perilaku fungsi asli.
SQL dan PLPGSQL baru perlu ditinjau. Saya tidak berharap pengembang mengingat untuk menulis public.to_date() setiap saat. Jika Anda menggunakan kontrol versi, Anda mungkin dapat menulis hook prakomit untuk memastikan hanya public.to_date() yang digunakan.
Fungsi asli to_date() memiliki perilaku yang tidak saya lihat didokumentasikan. Anda tidak hanya dapat menyebutnya dengan 29 Februari, Anda dapat menyebutnya dengan 345 Februari, atau Februari 9999.
select to_date('201302345', 'yyyymmdd');
2014-01-11
select to_date('2013029999', 'yyyymmdd');
2040-06-17