【问题标题】:Add "Months" to YYYYMM Integer将“月份”添加到 YYYYMM 整数
【发布时间】:2020-05-08 02:57:35
【问题描述】:

我有一个整数列,用于存储 yyyymm“日期”。怎么能加几个月呢?

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

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

我想添加两个“月”并返回:

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

【问题讨论】:

    标签: teradata teradata-sql-assistant


    【解决方案1】:

    对于 char 列:

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

    对于 int 列,避免从/到字符串的双重转换并基于内部存储应用一些逻辑会更有效:

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

    您应该与您的 DBA 联系,为该计算创建一个 SQL UDF。

    【讨论】:

    • 这很棒。谢谢。
    【解决方案2】:

    一般的方法,如果你铸造/使用日期:

    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
    

    【讨论】:

    • 是的,我想仓库团队有他们以这种方式存储它们的原因......尽管我遇到了一些格式问题,但您的解决方案让我大部分时间都得到了解决。如果有帮助,我会在原始帖子中添加编辑。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-03-26
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多