0

開始注文日フィールドと停止注文フィールドがあります。データベースをチェックして、開始注文と停止注文が支払い期間の開始フィールドと終了フィールドのいずれにも含まれていないかどうかを確認する必要があります。たとえば、2010年8月1日と10年8月14日と10年8月15日と10年8月28日と10年8月29日と10年9月11日はすべて1か月の支払い期間です。開始順序は2010年8月1日で、終了順序は2010年8月14日です。それでも、SQLを実行すると(支払い期間の開始と支払い期間の終了の間ではない終了順序)、2010年8月1日から2010年8月14日までが引き続き表示されます。私のニーズは、検索を停止して次のレコードの開始順序に進み、順序を停止して、レコード検索要件の最後に到達するまで次の検索を開始する日付が見つかった場合です。

クエリの応答性を維持するために、月ごとおよび年ごとに検索したいと考えています。データベースはかなり大きいです。私のクエリは、betweenチェックを1回だけ実行し、その後、支払い期間の開始と停止の間に収まるすべてのデータを表示するように継ぎ目があります。これは、私が見たくないデータです。

4

1 に答える 1

1

何のデータベース?

では、こんなテーブルはありますか?

CREATE TABLE something
(
  pay_period_start date NOT NULL,
  pay_period_end date NOT NULL,
  CONSTRAINT something_pkey PRIMARY KEY (pay_period_start),
  CONSTRAINT something_pay_period_end_key UNIQUE (pay_period_end),
  CONSTRAINT something_check CHECK (pay_period_end > pay_period_start)
);
insert into something values ('2010-08-01', '2010-08-14');
insert into something values ('2010-08-15', '2010-08-28');
insert into something values ('2010-08-29', '2010-09-11');

次に、このクエリを実行できます。('2010-08-14' は、ストップ オーダー列またはエンド オーダー列などの値です。)

select * from something
where '2010-08-14' not between pay_period_start and pay_period_end
order by pay_period_start;

そして私は得る

2010-08-15;2010-08-28
2010-08-29;2010-09-11

日付のペアには、OVERLAPS 演算子を使用します。このクエリ

select * from something
where 
  (date '2010-08-01', date '2010-08-14') overlaps 
  (pay_period_start,  pay_period_end) 
order by pay_period_start;

戻り値

2010-08-01;2010-08-14

開始順序と終了順序が支払い期間と完全に一致する行を除外するには、次のようにします。

select * from something
where (
  (date '2010-08-01', date '2010-08-14') overlaps 
  (pay_period_start, pay_period_end)               and
  (date '2010-08-01' <> pay_period_start)          and
  (date '2010-08-14' <> pay_period_end)
)
order by pay_period_start;
于 2011-01-21T01:11:16.630 に答える