2

私は DB2 を使用していますが、SQL の任意のフレーバーを使用するソリューションは、変換するのに十分簡単です。

このデータベースやデータベースを使用するアプリケーションを設計したのではありません。このアプリケーション、その動作、またはデータを変更する権限はありません。開始日と終了日の従来の使用法とは異なるため、特定の時点の選択のような単純なものを書くのに苦労しています。

表の関連/編集部分は次のとおりです。

OBJECTID    FACILITY_ID     START_DATE      END_DATE    FACILITY_NAME
1001        500             1/1/1980        5/1/2000    Really Old Name
1002        500             1/1/1980        1/1/2006    Old Name
1003        500             1/1/1980        null        Current Name
1004        501             1/1/1980        3/1/2008    Closed Facility Name
1004        502             1/1/1980        null        Another Current Name

私が返したいのは、2005 年 7 月 1 日に有効なレコードです。

OBJECTID    FACILITY_ID     START_DATE      END_DATE    FACILITY_NAME
1002        500             1/1/1980        1/1/2006    Old Name
1004        501             1/1/1980        3/1/2008    Closed Facility Name
1004        502             1/1/1980        null        Another Current Name

副選択を避けようとしていますが、必要な場合があることを理解しています。副選択が必要な場合は、1 つに制限したいと思います。開始日と終了日の間を検索しても、終了日が null のレコードが 1 つしかない施設は返されないため、機能しません。OR 条件を追加して null の終了日を含めると、場合によっては複数のレコードが返されることがあります。この問題はサービス上では非常に単純に見えるため、ばかばかしいほど明白な解決策を見逃しているに違いありません。誰にもアイデアはありますか?

4

6 に答える 6

2

これはうまくいきますか:

SELECT * FROM table_name
WHERE START_DATE < '7/1/2005' AND (END_DATE > '7/1/2005' OR END_DATE IS NULL);
于 2008-10-08T16:40:10.490 に答える
1

私自身の質問に答えてすみません。おかげさまで、回答は非常に役に立ちました。私が達成しようとしていたことを正確に考えることも役に立ちました。与えられた答えからの概念を組み合わせて、私はうまくいくように見える何かを思いつくことができました:

SELECT 
    * 
FROM 
    FACILITY_TABLE
WHERE 
    (END_DATE IS NULL
     AND OBJECTID NOT IN 
     (SELECT A.OBJECTID FROM FACILITY_TABLE A 
     WHERE '7/1/2005' BETWEEN A.BEGINDATE AND A.ENDDATE))
  OR 
    '7/1/2005' BETWEEN FACILITY_TABLE.START_DATE AND FACILITY_TABLE.ENDDATE

開始日はデータによって無意味にされたので、私はそれを含めませんでした。2005年7月1日に有効だったレコードのみが返されます。レコードの有効期限が切れた場合は、現在のレコードも含まれません。

于 2008-10-08T18:49:22.913 に答える
1

秘訣は、終了日を翌日に結合することです:)結合は基本的にnull値を2番目のパラメーターに置き換えます。かなりクールな小さなトリック。

select * from TAble where START_DATE < @DATE and Coalesce(END_DATE, @DATE+1) > @DATE
于 2008-10-08T16:40:57.133 に答える
1

テイク 2:

select OBJECTID, FACILITY_ID, START_DATE, FACILITY_NAME, MIN(END_DATE) as  END_DATE
from facitities
where START_DATE <= @my_date and (@mydate <= END_DATE or END_DATE is null)
group by OBJECTID, FACILITY_ID, START_DATE, FACILITY_NAME
于 2008-10-08T16:51:41.717 に答える
0

上記のわずかなバリエーション:

select * from facilities
where @my_date between START_DATE AND COALESCE(END_DATE, CURRENT DATE)
于 2008-12-24T15:41:13.647 に答える
0

あなたが私たちに与えたものから、これはあなたが望むものです:

select * from facitities
where START_DATE <= @my_date and (@mydate <= END_DATE or END_DATE is null)

しかし、あなたはそれを知っていて、何か違うことを望んでいると思います。その場合、データの何が問題なのかをより具体的にする必要があります。

于 2008-10-08T16:43:58.953 に答える