首頁 >資料庫 >mysql教程 >如何辨識 PostgreSQL 中玩家團隊成員資格的重疊日期範圍?

如何辨識 PostgreSQL 中玩家團隊成員資格的重疊日期範圍?

Patricia Arquette
Patricia Arquette原創
2025-01-04 09:30:35238瀏覽

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

識別PostgreSQL 中的重疊日期範圍

問題

用戶試圖檢索屬於某個玩家的列表給定年份範圍內的特定團隊。最初提出的查詢如下:

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)<= ?

但是,此查詢無法有效辨識重疊的日期範圍。

正確解決方案

到要準確確定重疊的日期範圍,必須修改查詢以考慮以下條件:

  1. 玩家在指定年份範圍開始前加入隊伍。
  2. 在指定年份範圍結束前沒有離開隊伍的玩家。
  3. 從未離開隊伍的玩家(以 NULL 表示) date_leave 值)。

最佳化查詢

以下查詢提供了更準確的解決方案:

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

說明

  • COALESCE 函數用於處理NULL date_leave 值,將它們視為開放範圍。
  • OVERLAPS 運算子會自動將每個間隔的開始設定為該對中較早的值。
  • 日期範圍 '[2009-01-01,2010-01-01)' 表示半開間隔,不包括上限已綁定。

額外注意事項

  • 在PostgreSQL 9.2 或更高版本中,範圍類型可以與索引支援一起使用,為基於範圍的查詢提供改進的性能。
  • 提供的查詢可以進一步最佳化透過在 daterange(date_join, date_leave) 表達式上建立表達式索引。

以上是如何辨識 PostgreSQL 中玩家團隊成員資格的重疊日期範圍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn