Teradata SQL转GCP BQ SQL日期运算报错排查与修正
报错原因定位
- 两类数据库日期类型实现逻辑存在本质差异:Teradata环境下
CURRENT_DATE返回整数型日期值(格式为YYYYMMDD,如20240520代表2024年5月20日),支持直接和整数做算术运算;但BigQuery中CURRENT_DATE原生为DATE数据类型,不支持与INT64整数直接做除法运算,因此触发类型不匹配报错。 - 原Teradata代码的实际业务逻辑:计算日期区间的两个边界,左边界为3个月前的自然月月初,右边界为当前自然月的最后一天。
BigQuery 适配写法
BigQuery提供原生DATE_TRUNC函数直接截断到月初,无需通过算术运算转换,完全匹配原逻辑的SQL写法如下:
-- 日期区间左边界:3个月前的自然月月初 DATE_ADD(DATE_ADD(DATE_TRUNC(CURRENT_DATE, MONTH), INTERVAL 1 MONTH), INTERVAL -4 MONTH) AND -- 日期区间右边界:当前自然月最后一天 DATE_SUB(DATE_ADD(DATE_TRUNC(CURRENT_DATE, MONTH), INTERVAL 1 MONTH), INTERVAL 1 DAY)
可以直接简化左边界写法,计算结果完全一致:
DATE_SUB(DATE_TRUNC(CURRENT_DATE, MONTH), INTERVAL 3 MONTH)
逻辑验证:以当前日期2024-05-20为例,上述代码返回左边界为2024-02-01,右边界为2024-05-31,与原Teradata代码计算结果无差异。
内容的提问来源于stack exchange,提问作者S M
相关产品推荐
相关产品推荐

