【发布时间】:2014-03-02 17:30:15
【问题描述】:
我正在尝试使用 Django 1.6 按start_time 小时过滤Performance。在控制台中我看到:
>>> Performance.objects.first().start_time
datetime.datetime(2014, 4, 6, 11, 0, tzinfo=<UTC>)
>>> Performance.objects.first().start_time.hour
11
但是,来自https://docs.djangoproject.com/en/1.6/ref/models/querysets/#hour 的文档:
>>> Performance.objects.filter(start_time__hour=11)
[]
如何按小时过滤?与这个(目前未回答的)问题非常相似:Django ORM: filter by hour range。
来自models.py:
class Performance(models.Model):
start_time = models.DateTimeField(db_index=True)
end_time = models.DateTimeField(default=None, blank=True, null=True)
...
【问题讨论】:
-
"当 USE_TZ 为 True 时,值会在过滤前转换为当前时区。"可能是这个原因??
-
不幸的是不是@almalki,我在 0-23 小时内得到相同的结果。
-
FWIW,我刚刚在自己的项目中对此进行了测试,效果很好。在我看来,你做的一切都是对的。正如@almalki 所指出的,属性访问将提供存储的UTC 时间,而查询将使用本地时间,因此如果您使用
USE_TZ并且不在本地以UTC 运行,则上述结果是正常的。但是,如果您每小时都尝试一次但没有得到任何结果,那就有问题了...... -
我创建了一些测试用例,一切正常。您可以看到生成的 SQL 语句并在您的数据库中运行它
-
感谢两位cmets。事实证明我必须在 mysql 中加载时区表。小时过滤器使用
CONVERT_TZ语句,该语句返回NULL而不包含时区表。 dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html