sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL opret indeks på cast fra streng til dato

Din første fejl var at gemme en dato som en varchar-kolonne. Det skal du ikke gøre.

Den korrekte løsning på dit problem er at konvertere kolonnen til en rigtig date kolonne .

Nu er jeg ret sikker på, at svaret på det udsagn er "Jeg har ikke designet databasen, og jeg kan ikke ændre den", så her er en løsning:

CAST og to_char() er ikke uforanderlige, fordi de kan returnere forskellige værdier for den samme inputværdi afhængigt af den aktuelle sessions indstillinger.

Hvis du ved, at du har et ensartet format af alle værdier i tabellen (hvilket - hvis du havde - ville betyde, at du kan konvertere kolonnen til en rigtig date kolonne), så kan du oprette din egen funktion, der konverterer en varchar til en dato og er markeret som uforanderlig.

create or replace function fix_bad_datatype(the_date varchar)
   returns date
   language sql
   immutable
as
$body$
  select to_date(the_date, 'yyyy-mm-dd');
$body$
ROWS 1
/

Med den definition kan du oprette et indeks på udtrykket:

CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));

Men du har at bruge præcis det funktionskald i din forespørgsel, så Postgres bruger det:

select *
from foo
where fix_bad_datatype(varchar_column) < current_date;

Bemærk, at denne tilgang vil mislykkes, hvis du kun har én "ulovlig" værdi i din varchar-kolonne. Den eneste fornuftige løsning er for at gemme datoer som date s,



  1. Sådan opretter du en lagret procedure i MySQL med Knex raw

  2. isset($_POST['submit']) virker ikke nu

  3. Udenlandske nøglebegrænsninger under dumping af data

  4. DataTable med Ajax fungerer ikke godt efter brug serverSide:sand