如何在SQLAlchemy中为Teradata时间戳添加秒或微秒间隔?
问题描述
在Teradata数据库上使用SQLAlchemy编写SELECT查询时,需要为表中的timestamp字段分别添加1整秒和0.000001秒的时间间隔,但直接使用Python的timedelta无法生成Teradata可识别的有效SQL。
尝试的SQLAlchemy代码:
select_final = select([select_base])\ .where(and_(tuple_(*bks,t.columns.VALID_UNTIL + timedelta(seconds = 1))\ .notin_(select([select_not_in])),(tuple_(*bks,t.columns.VALID_UNTIL + timedelta(seconds = 0.000001))\ .notin_(select([select_not_in])))))
目标Teradata SQL片段:
and (a.VSNR,a.RISIKO_SCHL, a.GUELTIG_BIS_ZP + INTERVAL '1.000000' SECOND) is not in (select b.VSNR,b.RISIKO_SCHL, b.GUELTIG_VON_ZP from P_LVM_CORE.AH_RISIKO as b where a.VSNR=b.VSNR and a.RISIKO_SCHL = b.RISIKO_SCHL ) and (a.VSNR,a.RISIKO_SCHL, a.GUELTIG_BIS_ZP + INTERVAL '0.000001' SECOND) is not in (select b.VSNR,b.RISIKO_SCHL, b.GUELTIG_VON_ZP from P_LVM_CORE.AH_RISIKO as b where a.VSNR=b.VSNR and a.RISIKO_SCHL = b.RISIKO_SCHL )
解决方案
Teradata使用INTERVAL 'X.YYYYYY' SECOND的语法表示时间间隔,SQLAlchemy无法直接将Python的timedelta转换为该格式,需要通过以下两种方式实现:
方法1:使用SQLAlchemy func构造Teradata时间间隔
通过func.interval直接生成Teradata支持的INTERVAL表达式:
from sqlalchemy import func, select, and_, tuple_ # 构造添加1秒的表达式 add_1_sec = t.columns.VALID_UNTIL + func.interval("'1.000000' SECOND") # 构造添加0.000001秒的表达式 add_000001_sec = t.columns.VALID_UNTIL + func.interval("'0.000001' SECOND") select_final = select([select_base]).where( and_( tuple_(*bks, add_1_sec).notin_(select([select_not_in])), tuple_(*bks, add_000001_sec).notin_(select([select_not_in])) ) )
方法2:使用text嵌入原生SQL片段
如果func.interval无法正常解析,直接用text写入Teradata原生的INTERVAL语法:
from sqlalchemy import text, select, and_, tuple_ add_1_sec = t.columns.VALID_UNTIL + text("INTERVAL '1.000000' SECOND") add_000001_sec = t.columns.VALID_UNTIL + text("INTERVAL '0.000001' SECOND") select_final = select([select_base]).where( and_( tuple_(*bks, add_1_sec).notin_(select([select_not_in])), tuple_(*bks, add_000001_sec).notin_(select([select_not_in])) ) )
注意事项
- Teradata的INTERVAL语法要求秒数格式为
'整数部分.小数部分',小数部分最多6位,对应微秒级别; - 两种方法都能生成目标SQL中的
字段 + INTERVAL 'X.XXXXXX' SECOND结构,确保SQL可在Teradata中正常执行。
内容的提问来源于stack exchange,提问作者Fasde
相关产品推荐
相关产品推荐

