在MySQL后端,Django在SQL中将filter(date__year=2011)
转换为... WHERE date BETWEEN 2011-01-01 00:00:00 and 2011-12-31 23:59:59.99
,执行时间为3秒。如果我手动删除时间部分并将其作为... WHERE date BETWEEN 2011-01-01 and 2011-12-31
运行,则执行时间会下降1/100到30毫秒。
似乎解释日期范围查询的基本问题。有什么想法来解决这个问题吗?
如果我找不到使用Django ORM的方法,我会在模型中添加一个额外的年份字段来存储年份并在该整数年字段上进行查询。
感谢您的时间。
p.s:对于我无法控制的限制,环境是Django 1.1。这可以在较新版本的Django中修复或更好地优化。
答案 0 :(得分:1)
你试过range
吗?看起来像django生成的sql等于你的原始sql。适用于1.1
.filter(date__range(datetime.date(2011,1,1), datetime.date(2011,12,31))
相当于:
SELECT ... WHERE date BETWEEN '2011-01-01' and '2011-12-31';