1

私は以下のように出力しました

ID      Date 
Null    2012-10-01
1       2012-10-02
2       2012-10-03
NULL    2012-10-04
3       2012-10-05
NULL    2012-10-06
4       2012-10-07
NULL    2012-10-08
5       2012-10-10
NULL    2012-10-11
NULL    2012-10-12
6       2012-10-13
NULL   2012-10-16

値がNULLの日付が欠落しているため。最終出力を次のように表示する必要があります

2012-10-01 - 2012-10-01 (1 day )
2012-10-04 - 2012-10-04(1 day )
2012-10-06 - 2012-10-06(1 day )
2012-10-08 - 2012-10-08(1 day )
2012-10-11 - 2012-10-12(2 day )
2012-10-14 - 2012-10-14(1 day )
4

1 に答える 1

0

次のクエリを使用して日付範囲を生成できます。

select
  min(date) as start,
  max(date) as end,
  datediff(max(date), min(date)) + 1 as numDays
from
  (select @curRow := @curRow + 1 AS row_number, id, date
   from Table1 join (SELECT @curRow := 0) r where ID is null) T
group by
  datediff(date, '2012-10-01 00:00:00') - row_number;

このロジックは、連続する範囲をグループ化する巧妙なトリックに基づいています。まず、サブクエリの行をフィルタリングして番号を付けます。次に、日数2012-10-01と行番号を比較して、グループ化された行を見つけます。この値を共有する行がある場合、それらは連続している必要があります。そうでない場合、2 つの行の間に「ジャンプ」が発生し、式datediff(date, '2012-10-01 00:00:00') - row_numberが一致しなくなります。

サンプル出力 ( DEMO ):

START                           END                             NUMDAYS
October, 01 2012 00:00:00+0000  October, 01 2012 00:00:00+0000  1
October, 04 2012 00:00:00+0000  October, 04 2012 00:00:00+0000  1
October, 06 2012 00:00:00+0000  October, 06 2012 00:00:00+0000  1
October, 08 2012 00:00:00+0000  October, 08 2012 00:00:00+0000  1
October, 11 2012 00:00:00+0000  October, 12 2012 00:00:00+0000  2
October, 16 2012 00:00:00+0000  October, 16 2012 00:00:00+0000  1

そこから、探している正確な出力を取得するのはかなり簡単だと思います。

于 2013-03-06T17:46:31.430 に答える