PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL създава индекс при прехвърляне от низ към дата

Първата ви грешка беше да съхраните дата като колона varchar. Не трябва да правите това.

Правилното решение за вашия проблем е да конвертирате колоната в реална date колоната .

Вече съм почти сигурен, че отговорът на това твърдение е „Не съм проектирал базата данни и не мога да я променя“, така че ето заобиколно решение:

CAST и to_char() не са неизменни, защото могат да върнат различни стойности за една и съща входна стойност в зависимост от настройките на текущата сесия.

Ако знаете, че имате последователен формат на всички стойности в таблицата (което - ако имахте - би означавало, че можете да конвертирате колоната в реална date колона), тогава можете да създадете своя собствена функция, която преобразува varchar в дата и е маркирана като неизменна.

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
/

С тази дефиниция можете да създадете индекс на израза:

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

Но вие имате за да използвате точно това извикване на функция във вашата заявка, така че Postgres да го използва:

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

Обърнете внимание, че този подход ще се провали сериозно, ако имате само една „незаконна“ стойност във вашата колона varchar. Единственото разумно решениесто за съхраняване на датите като date s,



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е да се издаде VACUUM ANALYZE <tablename> от psycopg2 или sqlalchemy за PostgreSQL?

  2. Как да надстроите до PostgreSQL 11 за Ubuntu 18.04?

  3. Как се пише SQL в миграция в Rails

  4. Грешка при запазване на geodjango PointField

  5. Изтрийте редове с външен ключ в PostgreSQL