2016-05-24 11 views
0

[Oracle 11gの特定の日に基づいてすべての可能な日付のリストを取得することで構成されています私は<code>presentation</code>テーブルを持っている

ID  DAY   START  END  STARTDATE  ENDDATE 
622 Monday  12:00:00 02:00:00 01-05-2016  04-06-2016 
623 Tuesday 12:00:00 02:00:00 01-05-2016  04-06-2016 
624 Wednesday 08:00:00 10:00:00 01-05-2016  04-06-2016 
625 Thursday 10:00:00 12:00:00 01-05-2016  04-06-2016 

私はSTARTDATEからENDDATEにすべての可能な日付をダウンリストしたいと思います。私はすべてのIDのすべての可能な日付を一覧表示することを除いて動作しているクエリを試してみました。私はすべての行が基本的に同じ日付を持つので、1つのIDから必要なだけかもしれません。

問合せ:

select 
    A.PRESENTATIONID, 
    A.PRESENTATIONDATESTART+delta dt 
from 
    PRESENTATION A, 
    (
    select level-1 as delta 
    from dual 
    connect by level-1 <= (
     select max(PRESENTATIONDATEEND- PRESENTATIONDATESTART) from PRESENTATION 
    ) 
) 
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND 
order by 1,2; 

結果:

622 01-05-2016 12:00:00 //startdate 
..... 
622 03-06-2016 12:00:00 
622 04-06-2016 12:00:00 //enddate 
..... 
625 04-06-2016 12:00:00 

結果は非常に面倒です!

私のpresentationテーブルに日が格納されている日のみをリストアップしたいと思います。たとえば、presentationの表では、日は月曜日、火曜日、午後、木曜日です。考えられる結果は次のようになります。

MONDAY 
02-05-2016 12:00:00 
09-05-2016 12:00:00 
16-05-2016 12:00:00 
23-05-2016 12:00:00 
30-05-2016 12:00:00 

TUESDAY 
03-05-2016 12:00:00 
10-05-2016 12:00:00 
17-05-2016 12:00:00 
24-05-2016 12:00:00 
31-05-2016 12:00:00 
.... until THURSDAY 

説明する方法では、この問題では、私は金曜日、土曜日と日曜日の日付を除外するようにしたいと思います。出来ますか?

UPDATE

新しいクエリ:

select 
    A.PRESENTATIONID, 
    A.PRESENTATIONDAY, 
    A.PRESENTATIONDATESTART+delta dt 
from 
    PRESENTATION A, 
    (
    select level-1 as delta 
    from dual 
    connect by level-1 <= (
     select max(PRESENTATIONDATEEND- PRESENTATIONDATESTART) from PRESENTATION 
    ) 
) 
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND 
and 
    a.presentationday = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day')) 
order by 1,2,3; 

結果:あなたは日と日付が一致しているかどうかを確認するために、カレンダーをチェックして

622 Monday 02-05-2016 12:00:00 
622 Monday 09-05-2016 12:00:00 
622 Monday 16-05-2016 12:00:00 
622 Monday 23-05-2016 12:00:00 
622 Monday 30-05-2016 12:00:00 
623 Tuesday 03-05-2016 12:00:00 
623 Tuesday 10-05-2016 12:00:00 
623 Tuesday 17-05-2016 12:00:00 
623 Tuesday 24-05-2016 12:00:00 
623 Tuesday 31-05-2016 12:00:00 
624 Wednesday 04-05-2016 12:00:00 
624 Wednesday 11-05-2016 12:00:00 
624 Wednesday 18-05-2016 12:00:00 
624 Wednesday 25-05-2016 12:00:00 
624 Wednesday 01-06-2016 12:00:00 
625 Thursday 05-05-2016 12:00:00 
625 Thursday 12-05-2016 12:00:00 
625 Thursday 19-05-2016 12:00:00 
625 Thursday 26-05-2016 12:00:00 
625 Thursday 02-06-2016 12:00:00 

:Dはありがとうございました@ dcieslak!

+0

MONDAYとTUESDAYを文字通りあなたの出力に表示するときは、そうではありませんか?別の列に表示されている曜日を欲しいですか? – mathguy

+0

いいえいいえ..それは人々に私が何を達成しようとしているのかを理解させることです。 – Mong2203

答えて

1

はあなたのクエリに追加します。

and 
    a.day = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day')) 

それはあなたのDAY列に等しくない日を削除します。 trimは、先頭と末尾の空白を取り除きたいので、「日」にとって重要です。

+0

"Day"を何かに置き換えなければなりませんか?それは何ですか? @dcieslak – Mong2203

+0

私の最初のコメントを無視してください。私はちょうど解決策を考え出した:Dありがとう!しかし、私は別の質問があります... – Mong2203

+0

...しかし、...どのように受け入れられた答えは、元の質問から、日付は一度だけ表示される必要があり、IDごとに繰り返される必要はありません。モン?あなたはあなたの心を変えましたか?要件は今異なっていますか? – mathguy

関連する問題