在DBT中将长整型时间戳转换为YYYY-MM-DD格式日期的问题
问题分析与解决方案
问题根源
你的DBT查询中存在模板语法误用:{{'scheme_t'}}会被DBT渲染成字符串常量'scheme_t',而非引用表中的scheme_t字段。当FROM_UNIXTIME()接收到这个字符串时,数据库会将其强制转换为数值,结果通常为0(无效字符串转数值的默认行为),而Unix时间戳0对应的日期就是1970-01-01,这就是你得到错误结果的原因。
修复后的查询
直接引用表字段即可,无需使用带引号的模板语法(如果没有动态字段需求的话):
SELECT id, scheme_name, DATE(FROM_UNIXTIME(scheme_t)) AS scheme_date FROM scheme_table;
如果确实需要通过DBT变量动态指定字段名(比如字段名由配置决定),则需要去掉引号,使用正确的变量引用方式:
SELECT id, scheme_name, DATE(FROM_UNIXTIME({{ scheme_t }})) AS scheme_date FROM scheme_table;
(注:此方式需确保你在DBT项目中已正确定义scheme_t变量,指向目标字段名)
验证结果
当输入时间戳1672492800时,FROM_UNIXTIME(1672492800)会返回'2023-01-01 00:00:00',经过DATE()函数提取后,最终得到正确的日期结果2023-01-01。
内容的提问来源于stack exchange,提问作者Parul
相关产品推荐
相关产品推荐

