sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL maakt index op cast van string tot datum

Je eerste fout was om een ​​datum op te slaan als een varchar-kolom. Dat moet je niet doen.

De juiste oplossing voor uw probleem is om de kolom te converteren naar een echte date kolom .

Nu ben ik er vrij zeker van dat het antwoord op die verklaring is:"Ik heb de database niet ontworpen en ik kan hem niet veranderen", dus hier is een tijdelijke oplossing:

CAST en to_char() zijn niet onveranderlijk omdat ze verschillende waarden kunnen retourneren voor dezelfde invoerwaarde, afhankelijk van de instellingen van de huidige sessie.

Als je weet dat je een consistente indeling hebt van alle waarden in de tabel (wat - als je dat had - zou betekenen dat je de kolom kunt converteren naar een echte date kolom) kunt u uw eigen functie maken die een varchar naar een datum converteert en als onveranderlijk wordt gemarkeerd.

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
/

Met die definitie kun je een index maken op de uitdrukking:

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

Maar je hebt om precies die functieaanroep in uw query te gebruiken, zodat Postgres het gebruikt:

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

Merk op dat deze aanpak slecht zal mislukken als je slechts één "illegale" waarde in je varchar-kolom hebt. De enige verstandige oplossing is om datums op te slaan als date s,



  1. verwijder niet-numerieke tekens in een kolom (karakter variërend), postgresql (9.3.5)

  2. Fout bij het hernoemen van een kolom in MySQL

  3. Importeer onbewerkte bytes als onbewerkte bytes in R

  4. Moeite met variabele lag-lengte