#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
Комментарии:
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'
— это просто строка.