DATE列のテーブルがあります。テーブルに特定の週末の日付がない場合に、今後n年間の週末の日付(土曜日または日曜日)を返すスクリプトを作成するにはどうすればよいですか?
2 に答える
今日から今日 + 365 日までのすべての週末を取得するには:
select as_of_date
from
(
select
rownum,
sysdate + rownum - 1 as as_of_date
from dual
connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, 'DY', 'nls_date_language=AMERICAN') in ('SAT', 'SUN')
特定のテーブルに存在する日付を除外するには、「and not exists (select 1 from your_table y where y.the_date = as_of_date)」などを追加します。
select as_of_date
from
(
select
rownum,
sysdate + rownum - 1 as as_of_date
from dual
connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, 'DY', 'nls_date_language=AMERICAN') in ('SAT', 'SUN')
and not exists (select 1 from my_table myt where myt.as_of_date = sub.as_of_date)
サブクエリを使用しないように単純化できます。「as_of_date」列の出現回数を「sysdate + rownum - 1」に変更するだけで問題ありません
週末だけでなく、すべての日付を取得する必要があるときに、そのクエリを使用したことも注目に値します。私が回答で行ったことは、最も外側のクエリで週末を除外することでした。不要なデータを返したくない場合は、最も内側のクエリを変更して、365 日を通過せず、週末の数だけを通過するように変更できると確信しています (つまり、 where rownum < 365/5 を使用して date + ( を取得します) 6,7) 土曜か日曜に始まりますが、これは大きなパフォーマンスの問題ではないと思うので、心配していませんでした
これらのタイプの質問はたくさん出てきます。それらは通常、ある種のシーケンスを作成し、それをマッピングし直すことを含みます。
代わりに、行方不明の日付の数に続いて不足している日付を見つけて生きることができる場合は、次のようなものが機能します。
select t.date+7, (nextdowdate - t.date)/7 as nummissing
from (select t.date, lead(t.date) over (partition by to_char(t.date, 'Dy') order by date) as nextdowdate
from t
where to_char(t.date, 'Dy') in ('Sat', 'Sun')
) t
where nextdowdate - t.date > 7 and
date between FirstDate and LastDate
これは、最初の日付が存在し、データが最後の日付を超えていることを前提としています。基本的には、日付間のギャップを見つけてから、1週間先に進み、ギャップの長さを数えます。