PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL tworzy indeks na podstawie rzutu od ciągu do daty

Pierwszym błędem było zapisanie daty jako kolumny varchar. Nie powinieneś tego robić.

Właściwym rozwiązaniem problemu jest przekonwertowanie kolumny na rzeczywistą date kolumna .

Teraz jestem prawie pewien, że odpowiedź na to stwierdzenie brzmi:„Nie zaprojektowałem bazy danych i nie mogę jej zmienić”, więc oto obejście:

CAST i to_char() nie są niezmienne, ponieważ mogą zwracać różne wartości dla tej samej wartości wejściowej w zależności od ustawień bieżącej sesji.

Jeśli wiesz, że masz spójny format wszystkich wartości w tabeli (co – gdybyś miał – oznaczałoby, że możesz przekonwertować kolumnę na rzeczywistą date kolumna), następnie możesz utworzyć własną funkcję, która konwertuje varchar na datę i jest oznaczona jako niezmienna.

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
/

Dzięki tej definicji możesz utworzyć indeks na wyrażeniu:

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

Ale masz aby użyć dokładnie tego wywołania funkcji w zapytaniu, aby Postgres go używał:

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

Zauważ, że to podejście nie powiedzie się, jeśli masz tylko jedną „nielegalną” wartość w kolumnie varchar. Jedynym sensownym rozwiązaniem jest aby przechowywać daty jako 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. Próbuję zainstalować psycopg2 na Mac OS 10.6.3; twierdzi, że nie może znaleźć pliku stdarg.h, ale widzę, że tam jest; co powinienem zrobić?

  2. Aktualizacja pola json w Postgres

  3. BŁĄD:ciąg w niekończonym cudzysłowie w miejscu lub w pobliżu

  4. Funkcja z zapytaniem SQL nie ma miejsca docelowego dla danych wynikowych

  5. Jak zaokrąglić wartość milisekund z timestamp(0) w PostgreSQL?