Добавить "Месяцы" в YYYYMM Integer - PullRequest
0 голосов
/ 22 января 2020

У меня есть целочисленный столбец, в котором хранится «дата» в ггггмм. Как можно добавить к нему месяцы?

CREATE VOLATILE TABLE tbl
(
prcs_mn int
) ON COMMIT PRESERVE ROWS;

INSERT INTO tbl VALUES (201602);
INSERT INTO tbl VALUES (201612);

Я хотел бы добавить два "месяца" и вернуть:

201604
201702

Я предполагаю, что приведение в некотором роде необходимо; однако синтаксис меня сбивает с толку.

Первое приведенное ниже решение дает формат даты «мм / дд / гггг». Я добавил второй cast, что привело к формату «гггг-мм» с дефисом. Я что-то упустил, где этот дефис можно удалить? В противном случае я обернул все это в функцию oreplace. Кажется, это работает, но довольно неприглядно ...

select prcs_mn
     , add_months( cast( cast(prcs_mn as varchar(6)) as date format 'yyyymm'), 2) as "mm/dd/yyyy"
     , cast(add_months(cast(cast(prcs_mn as varchar(6)) as date format 'yyyymm'), 2) as varchar(7)) as "yyyy-mm"
     , oreplace(cast(add_months(cast(cast(prcs_mn as varchar(6)) as date format 'yyyymm'), 2) as varchar(7)), '-', '') as yyyymm
from tbl;

prcs_mn mm/dd/yyyy  yyyy-mm yyyymm
201612  02/01/2017  2017-02 201702
201602  04/01/2016  2016-04 201604

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Для столбца char:

To_Char(Add_Months(To_Date(prcs_mn, 'YYYYMM'),2), 'YYYYMM')

Для столбца int более эффективно избегать двойного приведения из / в строку и применять некоторые логики c на основе внутреннего хранилища:

(Add_Months(Cast((prcs_mn - 190000) * 100 + 1 AS DATE), 2) / 100) + 190000

Вам следует поговорить со своим администратором базы данных, чтобы создать SQL UDF для этого расчета.

0 голосов
/ 22 января 2020

Общий способ сделать это, если вы приведете / работаете с датами:

select current_date, add_months(current_date,2);

В вашем случае, с очень странными способами хранения значений даты, будет что-то менее приятное:

select prcs_mn, add_months( cast( cast(prcs_mn as varchar(6)) as date format 'YYYYMM'), 2)
from tbl
...