Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy中datetime字段中的过滤时间范围_Python_Sqlalchemy - Fatal编程技术网

Python sqlalchemy中datetime字段中的过滤时间范围

Python sqlalchemy中datetime字段中的过滤时间范围,python,sqlalchemy,Python,Sqlalchemy,我在sqlalchemy中进行时间范围过滤时遇到了一个奇怪的问题。 事件表中有一个名为startDate的datetime列。我写这个查询是为了返回所有开始时间在下午6点到11点59分之间的事件(不管是哪一天) 我有以下代码 from sqlalchemy import and_, Date, Time, cast import datetime startingTime = datetime.time(18, 0, 0) endingTime = datetime.time(23, 59, 5

我在sqlalchemy中进行时间范围过滤时遇到了一个奇怪的问题。 事件表中有一个名为startDate的datetime列。我写这个查询是为了返回所有开始时间在下午6点到11点59分之间的事件(不管是哪一天)

我有以下代码

from sqlalchemy import and_, Date, Time, cast
import datetime
startingTime = datetime.time(18, 0, 0)
endingTime = datetime.time(23, 59, 59)
如果我跑

results = session.query(Event).filter(and_(cast(Event.startDate, Time)>=startingTime, cast(Event.startDate, Time)<=endingTime).all()
它返回表中的所有行

如果我按日期过滤

results = session.query(Event).filter(and_(cast(Event.startDate, Date)>=one_date, cast(Event.startDate, Date)<=another_date).all()

results=session.query(Event).filter(and_u)(cast(Event.startDate,Date)>=one_日期,cast(Event.startDate,Date)我无法复制此行为

要调试,请分步骤执行此操作:

session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > '00:00:00').all() 
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > '23:59:59').all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < '23:59:59').all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > datetime.time(23,59,59)).all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59)).all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59)).filter(cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(and_(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59), cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)>'00:00:00')。all()
#>全部
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)>'23:59:59')。all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)<'23:59:59')。all()
#>全部
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)>datetime.Time(0,0)).all()
#>全部
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)>datetime.Time(23,59,59)).all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)全部
session.query(TableName).filter(cast(TableName.some_datetimefield,Time)datetime.Time(0,0)).all()
#>全部
session.query(TableName).filter(和(cast(TableName.some_datetimefield,Time)datetime.Time(0,0)).all()
#>全部

事实上,我想这是因为我使用的是sql server 2005,而日期和时间对象将仅由sql server 2008之后的版本支持

我找到了使用func.convert完成此任务的另一种方法:

session.query(TableName).filter(func.convert(func.VARCHAR(8), TableName.datetimefield, 8) >= datetime.time(0,0)).all()

欢迎使用StackOverflow!请确保如果您包含的代码使用StackOverflow的内置格式功能。您可以突出显示您的代码并单击
{}文本编辑器工具栏中的
按钮来执行此操作。@CharlsGao:如果对于您显示的每个
SA查询
,您还将添加生成的
SQL
语句,这将非常有用。您可以通过传递设置
引擎启用日志记录。echo=True
。我运行了session.query(TableName)。filter(cast)(cast(TableName.some_datetimefield,Time)>datetime.Time(0,0)).all()返回除session.query(TableName.some_datetimefield,Time)之外的所有内容。filter(cast(TableName.some_datetimefield,Time)session.query(TableName.Time)<'23:59:59')。all()返回所有内容(TableName).filter(cast(TableName.some_datetimefield,Time)<'23:59:59').all()返回空结果([]),但session.query(TableName.some_datetimefield,Time)filter(cast(TableName.some_datetimefield,Time)>'00:00')。all()实际上返回所有内容。
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > '00:00:00').all() 
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > '23:59:59').all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < '23:59:59').all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) > datetime.time(23,59,59)).all()
# > []
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59)).all()
# > all
session.query(TableName).filter(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59)).filter(cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(and_(cast(TableName.some_datetimefield, Time) < datetime.time(23,59,59), cast(TableName.some_datetimefield, Time) > datetime.time(0,0)).all()
# > all
session.query(TableName).filter(func.convert(func.VARCHAR(8), TableName.datetimefield, 8) >= datetime.time(0,0)).all()