2014-06-25 45 views
0

我有一個表格,其中包含'dd.mm.yyyy'格式的日期列。 例如:通過SQL查詢獲取兩個日期之間月份的日期範圍列表

_______________________ 
cnt_id | cnt_date  | 
----------------------- 
1  | '15.01.2014' | 
2  | '03.04.2014' | 
3  | '10.05.2014' | 
----------------------- 

我怎樣才能得到最小和最大日之間的日期範圍的列表?

在我的例子,正確的結果應該是:

15.01.2014 - 31.01.2014 
01.02.2014 - 28.02.2014 
01.03.2014 - 31.03.2014 
01.04.2014 - 30.04.2014 
01.05.2014 - 10.05.2014 

我使用Oracle 11g如果的確很重要。 Thanx!

回答

1

給你:-)

with w1 as 
(-- Get min and max dates 
    select min(to_date(t.cnt_date, 'dd.mm.yyyy')) min_date, 
     max(to_date(t.cnt_date, 'dd.mm.yyyy')) max_date 
    from <your_table> t 
), 
w2 as 
(-- Get diff between them in months 
    select min_date, max_date, 
     to_number(to_char(max_date, 'MM')) 
     - to_number(to_char(min_date, 'MM')) delta 
    from w1 
) 
select w2.*, level, 
     -- Get min date if 1st range, else 1st day of month 
     case when level = 1 
      then min_date 
      else trunc(add_months(min_date, level - 1), 'MON') 
      end rleft, 
     -- Get max date if last range, else last day of month 
     case when level = delta + 1 
      then max_date 
      else trunc(add_months(min_date, level), 'MON') - 1 
      end rright 
from w2 
connect by level <= delta + 1 -- beware of + 1 to get ranges for all of them ! 

這給:

MIN_DATE  MAX_DATE DELTA LEVEL RLEFT  RRIGHT 
15-janv.-2014 10-mai-2014 4  1 15-jan-2014 31-jan-2014 
15-janv.-2014 10-mai-2014 4  2 01-feb-2014 28-feb-2014 
15-janv.-2014 10-mai-2014 4  3 01-mar-2014 31-mar-2014 
15-janv.-2014 10-mai-2014 4  4 01-apr-2014 30-apr-2014 
15-janv.-2014 10-mai-2014 4  5 01-may-2014 10-may-2014 
+0

驚人!完美的作品!感謝很多Emmanuel! –

相關問題