将 "Months" 添加到 YYYYMM 整数
Add "Months" to YYYYMM Integer
我有一个存储 yyyymm 的整数列"date."如何向其中添加月份?
CREATE VOLATILE TABLE tbl
(
prcs_mn int
) ON COMMIT PRESERVE ROWS;
INSERT INTO tbl VALUES (201602);
INSERT INTO tbl VALUES (201612);
我想添加两个 "months" 和 return:
201604
201702
我假设在某种程度上需要强制转换;但是,语法让我感到困惑。
下面的第一个解决方案给出了日期 'mm/dd/yyyy' 格式。我添加了第二个 cast
,这导致了带有连字符的 'yyyy-mm' 格式。我是否遗漏了可以删除连字符的内容?否则我将整个东西包装在 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
一般方法,如果你 cast/work 日期:
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
对于字符列:
To_Char(Add_Months(To_Date(prcs_mn, 'YYYYMM'),2), 'YYYYMM')
对于 int 列,避免双重转换 from/to 字符串并应用一些基于内部存储的逻辑会更有效:
(Add_Months(Cast((prcs_mn - 190000) * 100 + 1 AS DATE), 2) / 100) + 190000
您应该与您的 DBA 联系,为该计算创建一个 SQL UDF。
我有一个存储 yyyymm 的整数列"date."如何向其中添加月份?
CREATE VOLATILE TABLE tbl
(
prcs_mn int
) ON COMMIT PRESERVE ROWS;
INSERT INTO tbl VALUES (201602);
INSERT INTO tbl VALUES (201612);
我想添加两个 "months" 和 return:
201604
201702
我假设在某种程度上需要强制转换;但是,语法让我感到困惑。
下面的第一个解决方案给出了日期 'mm/dd/yyyy' 格式。我添加了第二个 cast
,这导致了带有连字符的 'yyyy-mm' 格式。我是否遗漏了可以删除连字符的内容?否则我将整个东西包装在 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
一般方法,如果你 cast/work 日期:
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
对于字符列:
To_Char(Add_Months(To_Date(prcs_mn, 'YYYYMM'),2), 'YYYYMM')
对于 int 列,避免双重转换 from/to 字符串并应用一些基于内部存储的逻辑会更有效:
(Add_Months(Cast((prcs_mn - 190000) * 100 + 1 AS DATE), 2) / 100) + 190000
您应该与您的 DBA 联系,为该计算创建一个 SQL UDF。