PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Gerar erro quando a data não é válida


Você pode escrever sua própria função to_date(), mas precisa chamá-la com seu nome qualificado pelo esquema. (Eu usei o esquema "público", mas não há nada de especial nisso.)
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

Usar o nome da função simples executa a função nativa to_date().
select to_date('20130229', 'yyyymmdd');
2013-03-01

O uso do nome qualificado pelo esquema executa a função definida pelo usuário.
select public.to_date('20130229', 'yyyymmdd');
ERROR: date/time field value out of range: "20130229"
SQL state: 22008

Eu sei que não é bem isso que você está procurando. Mas . . .
  • É mais simples do que reconstruir o PostgreSQL a partir do código-fonte.
  • Corrigir seu código-fonte SQL e PLPGSQL existente é uma simples pesquisa e substituição com um editor de streaming. Tenho certeza de que isso não pode dar errado, contanto que você realmente quere cada uso do to_date() nativo seja public.to_date().
  • A função nativa to_date() ainda funcionará conforme projetado. Extensões e outros códigos podem depender de seu comportamento um tanto peculiar. Pense muito antes de alterar o comportamento das funções nativas.

No entanto, novos SQL e PLPGSQL precisariam ser revisados. Eu não esperaria que os desenvolvedores se lembrassem de escrever public.to_date() todas as vezes. Se você usar o controle de versão, poderá escrever um gancho de pré-confirmação para garantir que apenas public.to_date() seja usado.

A função nativa to_date() tem um comportamento que não vejo documentado. Não só você pode chamá-lo com 29 de fevereiro, você pode chamá-lo com fevereiro 345 ou fevereiro 9999.
select to_date('201302345', 'yyyymmdd');
2014-01-11

select to_date('2013029999', 'yyyymmdd');
2040-06-17