Как получить первый и последний день недели в Oracle? - PullRequest
9 голосов
/ 01 апреля 2011

Мне нужно получить первый день и последний день недели из некоторых строк, имеющих такой формат:

'201118'

, где 2011 год, а 18 -номер недели.Зная номер недели, как мне узнать первый и последний день недели?

Как мне это сделать?

Ответы [ 13 ]

0 голосов
/ 02 апреля 2011

Вы можете попробовать этот подход:

  1. Получить текущую дату.

  2. Добавить количество лет, равное разницемежду годом текущей даты и указанным годом.

  3. Вычтите количество дней, которое является номером дня недели последней полученной даты (и оно даст нам последний день какой-либо недели).

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

  5. Вычтите 6 дней, чтобы получить первый день.

0 голосов
/ 01 апреля 2011

Если это не однократное преобразование данных, скорее всего, вы выиграете от использования таблицы календаря.

Наличие такой таблицы действительно упрощает фильтрацию или агрегирование данных за нестандартные периоды в добавление к обычным неделям ISO.Недели обычно ведут себя немного по-разному в разных компаниях и отделах внутри них.Как только вы покидаете «ISO-land», встроенные функции даты не могут вам помочь.

create table calender(
   day           date      not null -- Truncated date
  ,iso_year_week number(6) not null -- ISO Year week  (IYYYIW)
  ,retail_week   number(6) not null -- Monday to Sunday (YYYYWW)
  ,purchase_week number(6) not null -- Sunday to Saturday (YYYYWW)
  ,primary key(day)
);

Вы можете создать дополнительные таблицы для «purchase_weeks» или «retail_weeks», или просто агрегировать наthe fly:

select a.colA
      ,a.colB
      ,b.first_day
      ,b.last_day
  from your_table_with_weeks a
  join (select iso_year_week
              ,min(day) as first_day
              ,max(day) as last_day
          from calendar
         group  
            by iso_year_week
       ) b on(a.iso_year_week = b.iso_year_week)

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

Использование календарных таблиц дает незначительное преимущество в производительности, поскольку оптимизатор может обеспечить более точные оценки для статических столбцов, чем для вложенных вызовов add_months(to_date(to_char())).

0 голосов
/ 01 апреля 2011

Я думаю, что это просто утверждение select.Я надеюсь, что это работает, потому что я не мог проверить это дома, потому что у меня нет базы данных Oracle; -)

select to_date('201118', 'YYYYWW'), to_date('201118', 'YYYYWW')+7 from dual;

Вы должны быть осторожны, потому что есть разница между WW иIW.Вот статья, которая объясняет разницу: http://rwijk.blogspot.com/2008/01/date-format-element-ww.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...