связаны месяцами - PullRequest
       10

связаны месяцами

1 голос
/ 07 декабря 2010

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

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

Хорошо, я хочу использовать это в сценарии автоматизации разделов. Мой лучший выстрел на данный момент (довольно жалкий) дает недействительные месяцы, например, '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

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

ура товарищи,

е.

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

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

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

1 голос
/ 07 декабря 2010

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

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

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

0 голосов
/ 07 декабря 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...