PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL membuat indeks pada pemeran dari string hingga saat ini

Kesalahan pertama Anda adalah menyimpan tanggal sebagai kolom varchar. Anda tidak harus melakukan itu.

Perbaikan yang tepat untuk masalah Anda adalah mengonversi kolom menjadi date yang sebenarnya kolom .

Sekarang saya cukup yakin jawaban untuk pernyataan itu adalah "Saya tidak mendesain database dan saya tidak dapat mengubahnya", jadi inilah solusinya:

CAST dan to_char() tidak dapat diubah karena mereka dapat mengembalikan nilai yang berbeda untuk nilai input yang sama tergantung pada pengaturan sesi saat ini.

Jika Anda tahu bahwa Anda memiliki format yang konsisten dari semua nilai dalam tabel (yang - jika ada - berarti Anda dapat mengonversi kolom menjadi date yang sebenarnya kolom) maka Anda dapat membuat fungsi Anda sendiri yang mengubah varchar menjadi tanggal dan ditandai sebagai tidak dapat diubah.

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
/

Dengan definisi tersebut Anda dapat membuat indeks pada ekspresi:

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

Tapi Anda memiliki untuk menggunakan panggilan fungsi itu dalam kueri Anda sehingga Postgres menggunakannya:

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

Perhatikan bahwa pendekatan ini akan gagal total jika Anda hanya memiliki satu nilai "ilegal" di kolom varchar Anda. Satu-satunya solusi yang masuk akal adalah untuk menyimpan tanggal sebagai 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. PostgreSQL tidak akan mulai:server.key memiliki akses grup atau dunia

  2. Beberapa Rumus di PostgreSQL

  3. Kutipan dolar tanpa henti

  4. Menggunakan Barman untuk Pemulihan Bencana PostgreSQL

  5. Haruskah saya memiliki direktori Postgres saya tepat di sebelah folder proyek saya? Jika demikian, bagaimana?