Teradata中如何处理存储在INT字段的字符串格式日期?
解决Teradata中YYYYMMDD格式INT字段转DATE的问题
这问题我之前也碰到过,Teradata直接把整数CAST为DATE的逻辑确实容易踩坑!你遇到的3450年左右的日期,是因为Teradata默认会把整数当成自公元0年1月1日以来的天数来计算,20180308天换算下来自然就是遥远的未来日期了。
下面给你几个靠谱的解决方案,不需要改表结构就能搞定:
方法1:先转字符串再转DATE(最直观)
把INT类型的日期值先转换成8位字符串,再让Teradata识别为YYYYMMDD格式的日期。两种写法都可以:
- 用两次CAST:
CAST(CAST(date_field AS CHAR(8)) AS DATE FORMAT 'YYYYMMDD') - 用
TO_DATE函数:TO_DATE(CAST(date_field AS CHAR(8)), 'YYYYMMDD')
方法2:纯数值运算构造DATE(性能友好)
如果你的数据量很大,纯数值运算的性能可能比转字符串更好。通过拆分年、月、日的数值,用DATE()函数直接构造日期:
DATE( date_field / 10000, -- 提取年份:20180308 / 10000 = 2018 (date_field / 100) MOD 100,-- 提取月份:(20180308 / 100) = 201803,取模100得03 date_field MOD 100 -- 提取日期:20180308取模100得08 )
额外提示:处理无效日期值
如果你的字段里存在不符合YYYYMMDD规则的无效值(比如20180230),直接转换会报错。可以用VALIDDATE函数做校验,把无效值转为NULL或者其他默认值:
CASE WHEN VALIDDATE(CAST(date_field AS CHAR(8)) FORMAT 'YYYYMMDD') THEN CAST(CAST(date_field AS CHAR(8)) AS DATE FORMAT 'YYYYMMDD') ELSE NULL -- 这里可以替换成你需要的默认值,比如DATE '1900-01-01' END
内容的提问来源于stack exchange,提问作者bo-oz
相关产品推荐
相关产品推荐

