teradata - 将“月份”添加到 YYYYMM 整数
问题描述
我有一个存储 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
解决方案
对于 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。
推荐阅读
- sql - oracle中发生错误时如何回滚tran
- asp.net-core - asp .Net Core WSDL 集成
- hadoop - 如何修复 MapReduce 错误“ValueError: no enough values to unpack (expected 2, got 1)”
- json - 如何从 NASA API 解析天气数据
- python - Lektor CMS 安装在基本 OS 5.1.7 Hera 上失败
- python - python时间模块出人意料的结果
- javascript - 如何在节列表的每个对象中使用新键创建新的对象数组
- java - 使用控制器创建 bean 时出错。面临自动装配和限定符注释的问题
- firebase - Firestore 缓存 - 是否更新/设置修改缓存
- regex - 在正则表达式中如何用“。”分割。并匹配第一个数字块?