sql >> Databáze >  >> RDS >> PostgreSQL

Vyvolat chybu, když datum není platné

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



  1. Funkce MySQL LOG() – Vrátí přirozený logaritmus hodnoty

  2. Oracle MIN jako analytická funkce – zvláštní chování s ORDER BY?

  3. Příkaz CASE v klauzuli WHERE SQL

  4. Syntaxe SQL nebo omezení databáze?