Můžete napsat svou vlastní funkci to_date(), ale musíte ji volat s jejím názvem kvalifikovaným pro schéma. (Použil jsem schéma „veřejné“, ale na tom není nic zvláštního.)
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
Použití holého názvu funkce spustí nativní funkci to_date().
select to_date('20130229', 'yyyymmdd');
2013-03-01
Použití názvu kvalifikovaného pro schéma spustí uživatelem definovanou funkci.
select public.to_date('20130229', 'yyyymmdd');
ERROR: date/time field value out of range: "20130229"
SQL state: 22008
Vím, že to není úplně to, co hledáš. Ale . . .
- Je to jednodušší než přestavba PostgreSQL ze zdroje.
- Oprava stávajícího zdrojového kódu SQL a PLPGSQL je jednoduché vyhledávání a nahrazování pomocí editoru streamování. Jsem si docela jistý, že to nemůže dopadnout špatně, pokud opravdu chcete každé použití nativního to_date() jako public.to_date().
- Nativní funkce to_date() bude stále fungovat tak, jak byla navržena. Rozšíření a další kód mohou spoléhat na jeho poněkud zvláštní chování. Dobře a dlouho přemýšlejte, než změníte chování nativních funkcí.
Nové SQL a PLPGSQL by však musely být přezkoumány. Nečekal bych, že si vývojáři budou pamatovat pokaždé napsat public.to_date(). Pokud používáte správu verzí, možná budete moci napsat háček před potvrzením, abyste se ujistili, že se použije pouze public.to_date().
Nativní funkce to_date() má chování, které nevidím zdokumentované. Nejen, že to můžete volat s 29. únorem, můžete to volat únorem 345 nebo únorem 9999.
select to_date('201302345', 'yyyymmdd');
2014-01-11
select to_date('2013029999', 'yyyymmdd');
2040-06-17