2011-01-21 32 views
0

開始日のフィールドと停止の注文フィールド開始日と停止日が給与期間の開始日と終了日のいずれにも該当しないかどうかをデータベースで確認する必要があります。 01-aug-10と14-aug-10と15-aug-10と28-aug-10と29-aug-10と11-sep-10は、すべて1か月間の給与期間です。開始オーダー01-aug-10と終了オーダーは14-aug-10です。しかし、私が言ったSQLを実行すると(納期開始と支払い期末の間に終了しない場合)、01-aug-10から14-aug-10はまだ表示されます。私が必要とするのは、一致する日付が見つかった場合、次のレコードの開始順序に移動して注文を停止し、レコード検索要件が終了するまで次の検索を開始することです。2つの日付フィールド間の開始日と終了日の照会

私は月ごとに検索を行い、クエリの応答性を保ちたいと考えています。データベースはかなり大きいです。私のクエリの縫い目は、一度だけチェックをしてから、ペイ・ペイ・スタートとストップの間に収まるすべてのデータを表示します。それは私が見たくないデータです。

答えて

1

dbmsは何ですか?

このようなテーブルがありますか?

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; 
+0

をもOKですが、再びこれを試してみましょうが、ありますto_char(start_order、 'MM')= to_char(ppd_start)とto_char(end_order、 'MM')を使用するときに、(ppd_startとppd_endの間の)2つの日付(start_orderとend_order)フィールドを使用して、 = to_char(ppd_end、 'MM')とstart_order!= ppd_startとend_order!= ppd_endとppd_endとppd_endとの間ではなくppd_endとend_orderの間ではなく、ppd_startとppd_endの間ではないstart_order)どうして? – Frank

+0

SQLのOVERLAPS演算子は2つの日付をとります。私は重複の例を含めるために私の答えを編集しました。 –

+0

興味深いですが、SQLはWebページ内で実行されています。したがって、ドロップダウン選択はデータベース内の選択されたテーブルに関連付けられ、選択されたアイテムはSQLに入力されたと言われています。だから私は現場で物理的な日付を使わなくても、このSQLをどのように動作させるかについては、サイト上ではほとんど望みません。 DDL_1は、検索を実行する物理年を選択してpp_yrから取得し、ppd_mon(1〜12)から引き出したDDL_2からレビューする月を選択し、to_char(start_order、 'MM')= ppd_monを使用して比較を行い、 to_char(end_order、 'MM')= ppd_monとstart_orderはppdの間ではありません* – Frank