Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengenalpasti Julat Tarikh Bertindih dalam PostgreSQL untuk Keahlian Pasukan Pemain?

Bagaimana untuk Mengenalpasti Julat Tarikh Bertindih dalam PostgreSQL untuk Keahlian Pasukan Pemain?

Patricia Arquette
Patricia Arquetteasal
2025-01-04 09:30:35237semak imbas

How to Identify Overlapping Date Ranges in PostgreSQL for Player Team Membership?

Mengenalpasti Julat Tarikh Bertindih dalam PostgreSQL

Masalah

Seorang pengguna berusaha untuk mendapatkan semula senarai pemain yang dimiliki oleh pasukan tertentu dalam julat tahun tertentu. Pertanyaan yang dicadangkan pada mulanya adalah seperti berikut:

SELECT * 
FROM   contract 
JOIN   team USING (name_team) 
JOIN   player USING(name_player) 
WHERE  name_team = ? 
AND    DATE_PART('YEAR',date_join)>= ? 
AND    DATE_PART('YEAR',date_leave)<= ?

Walau bagaimanapun, pertanyaan ini tidak mengenal pasti julat tarikh bertindih dengan berkesan.

Penyelesaian Betul

Kepada menentukan julat tarikh bertindih dengan tepat, pertanyaan mesti diubah suai untuk mempertimbangkan perkara berikut kriteria:

  1. Pemain yang menyertai pasukan sebelum permulaan julat tahun yang ditentukan.
  2. Pemain yang tidak meninggalkan pasukan sebelum akhir julat tahun yang ditentukan.
  3. Pemain yang tidak pernah meninggalkan pasukan (diwakili oleh NULL date_leave nilai).

Pertanyaan Dioptimumkan

Pertanyaan berikut menyediakan penyelesaian yang lebih tepat:

SELECT DISTINCT name_player 
FROM   contract
WHERE  name_team = ? 
AND    (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
       (date '2009-01-01', date '2010-01-01');  -- upper bound excluded

Penjelasan

  • Fungsi COALESCE digunakan untuk mengendalikan NULL date_leave nilai, menganggapnya sebagai julat terbuka.
  • Operator OVERLAPS secara automatik menetapkan permulaan setiap selang sebagai nilai awal pasangan.
  • Julat tarikh '[2009-01-01,2010- 01-01)' mewakili selang separuh terbuka, tidak termasuk bahagian atas terikat.

Pertimbangan Tambahan

  • Dalam PostgreSQL 9.2 atau lebih baru, jenis julat boleh digunakan dengan sokongan indeks, memberikan prestasi yang lebih baik untuk berasaskan julat pertanyaan.
  • Pertanyaan yang disediakan boleh dioptimumkan lagi dengan mencipta indeks ungkapan pada ungkapan daterange(date_join, date_leave).

Atas ialah kandungan terperinci Bagaimana untuk Mengenalpasti Julat Tarikh Bertindih dalam PostgreSQL untuk Keahlian Pasukan Pemain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn