Генерировать 3 года

#sql #oracle

#sql #Oracle

Вопрос:

Привязка для генерации данных за 3 года, как показано ниже

 31-DEC-17
31-DEC-18
31-DEC-19
  

приведенный ниже запрос генерирует 3 месяца. Как мне перенести это на 3 года

 select LAST_DAY(add_months(date '2017-01-01', level - 1)) as mth 
        from dual 
        connect by level <= 3
  

Ответ №1:

Умножьте параметр на 12:

 select last_day(add_months(date '2017-01-01', (level - 1) * 12 )) as mth 
  from dual 
  connect by level <= 3
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Быстрый вопрос, просто чтобы добавить к этому.. как мы извлекаем последнюю дату из года? LAST_DAY (извлечь (год из sysdate))??

2. Последний день года фиксирован. Так что '31-DEC-'||extract(year from sysdate) сделал бы это (в зависимости от ваших настроек даты NLS.

3. @APC имеет смысл. Спасибо

4. Спасибо. Как мне изменить это, чтобы отображать только часть года, такую как 2017, 2018, 2019. Пробовал извлечь (год из ‘2017-01-01’), но, похоже, не работает

5. Вы можете использовать extract или to_char как в этой демонстрации .

Ответ №2:

используйте <=36, который будет генерироваться до 31 декабря-19

     select LAST_DAY(add_months(date '2017-01-01', level - 1)) as mth 
        from dual 
        connect by level <= 36
  

Комментарии:

1. Спасибо. Но я хочу только последний день календарного года.. Если я сохраняю <= 36, это повторяется каждые месяцы. Я просто хочу последний день для каждого года .. вот так 31-17 декабря 31-18 декабря 31-19 декабря

Ответ №3:

Как упоминает @APC, функция last_day зависит от ваших настроек даты NLS. Таким образом, вы можете предпочесть, чтобы truncate функция была усечена до единицы, указанной yyyy , как показано ниже :

 select add_months(trunc(date'2017-01-01','yyyy'), level * 12 ) - 1
       as "Last Days"
  from dual 
connect by level <= 3;

Last Days
----------
2017-12-31
2018-12-31
2019-12-31
  

Demo

Комментарии:

1. Спасибо. Как мне изменить это, чтобы отображать только часть года, такую как 2017, 2018, 2019. Пробовал извлечь (год из ‘2017-01-01’), но, похоже, не работает

2.@sunnybabau всегда пожалуйста. вы можете попробовать: extract ( year from add_months(trunc(date'2017-01-01','yyyy'), level * 12 ) - 1 ) ИЛИ to_char ( add_months(trunc(date'2017-01-01','yyyy'), level * 12 ) - 1, 'yyyy' ) получить 2017, 2018, 2019 . Поскольку add_months(trunc(date'2017-01-01','yyyy'), level * 12 ) - 1 возвращает date значение типа.

3. @sunnybabau В вашем случае вам необходимо преобразовать в extract(year from date'2017-01-01') . Поскольку only '2017-01-01' — это просто строка.