2012-06-04 2 views
3

У меня есть таблица, которая содержит событие и дату ее окончания следующим образом -Как получить дату начала и дату окончания события от даты окончания

Event_id Event_name  Event_end_date 
1   Name Change  31-Mar-2010  (prior to 31-Mar-2010) 
2   Parent change  31-Oct-2010  (Logically its duration is 1-Apr-2010 (31-Mar-2010 + 1(Day)) to 31-Oct-2010) 
3   Name Change  31-Jul-2011  (Logically its duration is 1-Nov-2010 (31-Oct-2010 + 1(Day)) to 31-Jul-2011) 

, поэтому я хочу, чтобы написать запрос, чтобы получить результаты следующим образом -

Event_id Event_name  Event_start_date Event_end_date 
1   Name Change  -    31-Mar-2010 
2   Parent change 1-Apr-2010   31-Oct-2010 
3   Name Change  1-Nov-2010   31-Jul-2011 

ответ

2
SELECT event_id, event_name, 
    LAG (event_end_date) OVER (ORDER BY event_end_date ASC)+1 
                 event_start_date, 
    event_end_date 
FROM event 

enter image description here

+0

Можете ли вы объяснить LAG (event_end_date + 1, 1, NULL) OVER (ORDER BY event_end_date ASC NULLS LAST) event_start_date condi –

+0

Что мне делать, если я хочу получить результат в порядке убывания event_end_date? –

+0

'LAG' имеет возможность вычислять выражение в предыдущих строках (строки, которые будут поступать до текущей строки) и вернуть значение в текущую строку. Вот что я сделал, я заказываю строки на основе end_date в по возрастанию, поэтому для первой строки, т.е. '31/03/2010', нет предыдущей строки, поэтому она будет помещать значение null для даты начала и т. д. '. См. мой обновленный ответ. –

0

Это можно сделать, используя Self Left Outer Join, используя event_id для объединения таблиц.

 select t1.Event_id ,t1.Event_name, coalesce(t2.Event_end_date,'-'), 
      t1.Event_end_date 
     from event_table t1 
       left outer join event_table t2 
     on t1.Event_id=t2.Event_id+1 

Это работает в mysql. Должен работать и в оракуле.

2
select event_id, 
     event_name, 
     (lag(event_end_date) over (order by event_end_date)) + 1 as event_start_date, 
     event_end_date 
from event_table 
order by event_end_date desc 
+0

Что мне делать, если я хочу получить результат в порядке убывания event_end_date? –

+2

@PramodKumar: просто добавьте заказ (см. Мое редактирование) –

0

Я хотел бы сделать это с регулярным выражением :)

select event_id, 
     event_name, 
     REGEXP_SUBSTR(comments, ' \d+-\w{3}-\d{4} ') as event_start_date, 
     to_char(event_end_date,'dd-MON-yyyy') 
from events 

http://sqlfiddle.com/#!4/fa1e5/16/0

+0

В таблице нет этих комментариев, они только там, чтобы объяснить точку Прамода –

Смежные вопросы