2010-12-07 3 views
1

Хорошо, я новичок в этом connect by вещах. Но это всегда полезно. У меня есть эта небольшая проблема, которую вы, ребята, могли бы мне помочь ..., связанный по месяцам

Учитывая начальный месяц (скажем to_char(sysdate,'YYYYMM')) и конец месяца (скажем, to_char(add_months(sysdate, 6),'YYYYMM')), хотите получить список месяцев между ними, в том же формате ,

Ну, я хочу использовать это в сценарии автоматизации разделов. Мой лучший снимок до сих пор (довольно жалкий) дает недостоверные месяцев eg'201034' ... (и да, я знаю, невероятно неэффективен)

Следит код:

SELECT id 
from 
    (select to_char(add_months(sysdate, 6),'YYYYMM') as tn_end, to_char(sysdate,'YYYYMM') as tn_start from dual) tabla, 
    (select * from 
     (Select Level as Id from dual connect by Level <= (Select to_char(add_months(sysdate, 1),'YYYYMM')from dual)) where id > to_char(sysdate,'YYYYMM')) t 
Where 
    t.Id between tabla.tn_start and tabla.tn_end 

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

ура,

f.

+0

Было бы намного проще автоматизировать это с помощью цикла в PL/SQL, и оно будет намного более удобным для обслуживания. – 2010-12-07 11:04:25

ответ

1

Лучшим способом может быть выделение генератора строк из функции даты. Итак, сгенерируйте список от 0 до 6 и вычислите месяцы из этого. Если вы хотите пройти месяцы в то делать, что в с п

with my_counter as (
    Select Level-1 as id 
    from dual 
    connect by Level <= 7 
) 
select to_char(add_months(sysdate, id),'YYYYMM') from my_counter 

В приведенном ниже примере позволит вам подключить нужные вам требуется, чтобы работать на разницу.

with my_counter as (
    Select Level-1 as id 
    from dual 
    connect by level <= months_between(add_months(trunc(sysdate,'MM'), 6), 
     trunc(sysdate,'MM')) + 1 
) 
select to_char(add_months(trunc(sysdate, 'MM'), id),'YYYYMM') from my_counter 
0

Попробуйте это:

with numbers as 
(select level as n from dual 
    connect by level <= 7 
) 
select to_char (add_months (trunc(sysdate,'MM'), n-1), 'YYYYMM') id 
from numbers; 

ID 
------ 
201012 
201101 
201102 
201103 
201104 
201105 
201106 
+0

прямо в лицо. Спасибо друг. – filippo 2010-12-07 11:44:56

1

Для создания даты и диапазонов дат, я настоятельно рекомендую вам создать постоянную календарную таблицу с одной строкой для каждого дня. Даже если вы сохраните 20 лет в этой таблице, это будет небольшая ~ 7500 строк. Наличие такой таблицы позволяет добавить к дате дополнительную (потенциально нестандартную) информацию. Например, ваша компания может использовать 6-недельный отчетный период, который вы не можете извлечь, используя TO_CHAR/TO_DATE. Предварительно вычислите его и сохраните в этой таблице.

О, и Oracle 11g имеет автоматическое управление разделами. Если вы застряли с 10g, то эта статья может вас заинтересовать? Automatic Partition Management for Oracle 10g

+0

Это потрясающе! Огромное спасибо. К сожалению, я застрял в 10g, и я не (хе-хе, поскольку моя новизна становится очевидной) DBA, поэтому не имеют доступа к таким вещам. Спасибо за головы, так или иначе. +1! – filippo 2010-12-07 11:43:04

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