SQLAlchemy查询SQL Server 2008 datetime2时段数据无返回如何解决
问题原因分析
- 代码语法错误:
session.query(sa.Name cast(sa.FinishDate, DATE))两个查询字段之间缺少逗号,若实际代码存在该问题会直接导致执行异常,优先检查修正。 cast用法错误:直接对Python字符串类型的bb、cc执行SQLAlchemy的cast转换不符合规范,cast方法第一个参数应为表字段或SQL表达式对象,直接转换字符串可能导致生成的SQL中日期解析与SQL Server的区域规则不匹配。- 过滤字段不匹配:你问题描述中要查询的时间字段是
finishdate,但代码过滤逻辑用的是SamplingTime字段,若实际时间数据存储在FinishDate中,会直接导致无匹配结果。 - 附加过滤条件排除所有结果:
sa.SamplingType != 0条件可能已经把所有符合时间范围的数据全部过滤掉。
排查步骤
- 打印原生SQL验证逻辑
把查询语句去掉.all()后直接打印,拿到生成的原生SQL放到SQL Server管理工具中直接执行,确认SQL本身是否能返回数据:
q = session.query(sa.Name, cast(sa.FinishDate, DATE)).filter( cast(sa.SamplingTime, DATE).between(cast(bb, DATE), cast(cc, DATE)), sa.SamplingType != 0 ) print(q)
如果原生SQL执行也无结果,说明是查询逻辑问题,而非SQLAlchemy层面的问题。
2. 简化过滤条件排查
先注释掉sa.SamplingType != 0条件,执行查询看是否有返回,若有结果则说明是该附加条件过滤掉了所有符合要求的数据。
3. 确认映射关系正确
确认sa对象是你要查询的表的映射类,SamplingTime、SamplingType等字段的类型、名称和数据库中完全一致。
修正后的代码
推荐先把Python字符串转为datetime对象传参,避免SQL日期解析异常:
from sqlalchemy import DATE, cast from datetime import datetime # 字符串转Python datetime对象 bb = datetime.strptime("2021-10-11 12:21:23", "%Y-%m-%d %H:%M:%S") cc = datetime.strptime("2021-10-17 16:12:34", "%Y-%m-%d %H:%M:%S") # 写法1:按日期范围匹配,包含10-11到10-17的所有数据 record = session.query(sa.Name, cast(sa.FinishDate, DATE)).filter( cast(sa.SamplingTime, DATE).between(bb.date(), cc.date()), sa.SamplingType != 0 ).all() # 写法2:更稳妥的时间范围匹配,避免DATE截断导致的边界问题 record = session.query(sa.Name, cast(sa.FinishDate, DATE)).filter( sa.SamplingTime >= bb, # 结束时间加1天,10-17当天所有时间都会被包含 sa.SamplingTime < datetime(2021,10,18), sa.SamplingType != 0 ).all()
内容的提问来源于stack exchange,提问作者yuzimo
相关产品推荐
相关产品推荐

