Oracle 10g: выбор даты n из двойного формата ГГГГ-ММ

Я пытаюсь отобразить 12 месяцев из 5 лет назад в марте. Единственный способ, которым я могу это исправить, это:

select to_char(add_months(sysdate, level-51),'YYYY-MM') 
from dual 
connect by level <= 12

Какой дисплей:

2014-03
2014-04
2014-05
...

Однако мне нужно свидание.

Но попытка использования:

select to_date(to_char(add_months(sysdate, level-51),'YYYY-MM'),'YYYY-MM') 
from dual 
connect by level <= 12

Укажите месяцы:

2014-03-01
2014-04-01
2014-05-01
...

Вопрос Есть ли у кого-нибудь решение?

РЕДАКТИРОВАТЬ:

Делает

alter session set nls_date_format='YYYY-MM';

Устраните проблему, но как установить этот формат в хранимой процедуре?


person Hey StackExchange    schedule 23.05.2018    source источник
comment
Итак, вы хотите получить тип даты на выходе и отобразить их в формате «ГГГГ-ММ»? IMO, вы должны сделать это форматирование на уровне представления (интерфейс, приложение), потому что какой бы формат вы ни делали в своей базе данных, вывод, который вы получите в своем приложении, будет датой и временем, который может иметь формат отображения по умолчанию, отличный от вашей базы данных.   -  person Pham X. Bach    schedule 23.05.2018
comment
Это связано с этой проблемой: stackoverflow.com/questions/50476162/ Теперь у меня есть решение этой проблемы, но оно будет работать, только если я смогу преобразовать ГГГГ-ММ-ДД в ГГГГ-ММ.   -  person Hey StackExchange    schedule 23.05.2018
comment
Для вашей предыдущей проблемы вы должны выполнить CROSS JOIN, используя свою таблицу календаря и свой отдельный EID, вместо цикла for. И почему вы заботитесь о формате типа даты и времени, когда пытаетесь вставить в таблицу? После вставки это просто тип даты и времени, и он будет иметь все части: год, месяц, день, час, минута, секунды. Найдите и узнайте больше о типе данных oracle DATE. Так что вам нужно только SELECT TRUNC(ADD_MONTHS(SYSDATE, LEVEL-51), 'MM') FROM dual CONNECT BY LEVEL <= 12   -  person Pham X. Bach    schedule 23.05.2018
comment
Спасибо. Действительно нашел решение по вашему предложению.   -  person Hey StackExchange    schedule 23.05.2018


Ответы (1)


Вы можете просто обрезать полученные значения:

select trunc(add_months(sysdate, level-51), 'MM')
from dual
connect by level <= 12
person Gordon Linoff    schedule 23.05.2018
comment
Спасибо. Как будет выглядеть эта команда, если sysdate будет строкой? Например, "2014-05" не подойдет. Есть ли способ избежать ввода полной строки даты (со временем)? - person Hey StackExchange; 23.05.2018
comment
@HeyStackExchange . . . Я не понимаю вопроса. sysdate — это дата. Вы должны использовать дату для этого метода. Если у вас есть строка, преобразуйте ее в дату. - person Gordon Linoff; 23.05.2018