如何将Teradata的x_date/100+190000日期运算转换为BigQuery语法
Teradata 原运算逻辑拆解
Teradata 中 DATE 类型参与算术运算时,会先隐式转换为整数,转换规则为 (年份 - 1900) * 10000 + 月份 * 100 + 当日号,例如日期2022-06-06会被转为整数1220606。
对该整数执行/100运算时,Teradata 采用向下截断的整数除法规则,直接舍弃小数部分,相当于抹掉最后两位代表“当日号”的数值,得到(年份 - 1900)*100 + 月份格式的整数,例如1220606 / 100 = 12206。
在此结果上加190000后,得到的整数格式为年份*100 + 月份,例如12206 + 190000 = 202206。Teradata 将该整数隐式转回 DATE 类型时,会自动补全日位为当月1日,最终返回传入日期所属月份的第一天。
用你提供的示例数据验证,原运算返回结果完全匹配以下对应关系:
- 输入
2022-06-06→ 输出2022-06-01 - 输入
2020-03-06→ 输出2020-03-01 - 输入
2019-09-01→ 输出2019-09-01 - 输入
2028-05-06→ 输出2028-05-01
BigQuery 等价实现
BigQuery 无需模拟整数转换逻辑,直接使用原生日期截断函数即可100%对齐Teradata执行结果,最终返回DATE类型,代码如下:
SELECT DATE_TRUNC(x_date, MONTH) AS x_date FROM x_table
如果需要通过整数运算逻辑交叉验证等价性,可以使用以下写法,返回结果和上述写法完全一致,但执行效率更低,不推荐生产环境使用:
SELECT PARSE_DATE( '%Y%m%d', CONCAT(CAST(EXTRACT(YEAR FROM x_date)*100 + EXTRACT(MONTH FROM x_date) AS STRING), '01') ) AS x_date FROM x_table
注意:BigQuery 不支持DATE类型直接参与算术乘除运算,因此整数模拟写法需要先单独提取年、月字段拼接,和Teradata隐式转换的计算规则完全对齐。
内容的提问来源于stack exchange,提问作者Ignacio
相关产品推荐
相关产品推荐

