3

例の日付として、このような2年間のテーブルにいくつかの日付があります

01-jan-2012
02-jan-2012
04-jan-2012
05-jan-2012
06-jan-2012
07-jan-2012
09-jan-2012
11-jan-2012
.
.
.
01-DEC-2012

03-jan-2012すべての日付でとの日付が欠落していることに気付いたと思います。私の08-jan-2012質問は、オラクルで欠落している日付を見つける方法があるということです.Plz Help !

4

3 に答える 3

8

これにより、1年間のすべての欠落日が取得されます( SQL Fiddle )。

all_dates2012 年のすべての日付のリストを生成し (必要に応じて調整)、ソース テーブルに存在する日付をLEFT JOINチェックして除外します。IS NULL

WITH all_dates AS (
  SELECT TO_DATE('01-jan-2012') + ROWNUM - 1 AS d
  FROM dual
  CONNECT BY ROWNUM <= ADD_MONTHS(TO_DATE('01-jan-2012'), 12 ) - TO_DATE('01-jan-2012')
)
SELECT all_dates.d
FROM all_dates
LEFT JOIN t ON ( t.d = all_dates.d )
WHERE t.d IS NULL
ORDER BY all_dates.d
;

日付を 3 回ハードコーディングする代わりに、必ずバインド変数を使用してください。

于 2012-12-21T11:54:26.773 に答える
1

必要な日付範囲のシーケンスを生成し、LEFT JOIN を使用して欠落した日付を見つけることができます。

于 2012-12-21T11:50:01.787 に答える
0

@Peterとほぼ同じ答えですが、バージョンがわずかに異なります。

select all_dates.date_ missing_dates from 

(select to_date('01-Jan-14') + level - 1 date_
from dual connect by level <= 365) all_dates 

left join

((select to_date('01-Jan-14') + level - 1 date_
from dual connect by level <= 365)               

minus

(select to_date(round (dbms_random.value (1, 28))
        || '-'
        || round (dbms_random.value (01, 12))
        || '-'
        || round (dbms_random.value (2014, 2014)),
        'DD-MM-YYYY') + level - 1 random_date_1 
from dual
connect by level <= 52)) transaction_data

on all_dates.date_ = transaction_data.date_
where transaction_data.date_ is null;
于 2015-01-31T10:19:33.090 に答える