PostgreSQL(SQLAlchemy):分组前将时间差转为整数天数的方法
解决SQLAlchemy中PostgreSQL分组时
grp列的整数转换问题 你遇到的问题是因为PostgreSQL中日期相减得到的interval类型除以整数后,会保留非整数的时间部分(比如半天),导致分组时出现非整数的grp值。要在分组前把grp转为整数,可以通过以下两种方式实现:
方法1:基于秒数计算的整数除法
利用date_part('epoch', ...)获取时间差的总秒数,除以每天秒数(86400)与周期长度的乘积,再用PostgreSQL的div函数做整数除法,直接得到整数分组:
date = func.date_trunc('day', M.event_time) # 计算总秒数,除以(每天秒数*周期长度)得到整数grp grp = func.div( func.date_part('epoch', date - start_date), 86400 * period_length ).label('grp') session.query(..., grp) .filter(..., date >= start_date) .group_by('grp', ...)
方法2:浮点数转整数取整
先将时间差转为天数的浮点数,除以周期长度后用floor()取整,再转为整数类型:
date = func.date_trunc('day', M.event_time) # 计算天数浮点数,除以周期长度后向下取整为整数 grp = func.floor( func.date_part('epoch', date - start_date) / (86400 * period_length) ).cast(Integer).label('grp') session.query(..., grp) .filter(..., date >= start_date) .group_by('grp', ...)
这两种方法都能确保grp是整数,让分组逻辑符合预期。比如当周期长度为2时,2.5天的时间差会被转为1(整数除法或向下取整),3天的时间差会被转为1,4天则转为2,以此类推。
内容的提问来源于stack exchange,提问作者mibm
相关产品推荐
相关产品推荐

