【问题标题】:How to filter by hour in Django 1.6+如何在 Django 1.6+ 中按小时过滤
【发布时间】: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

标签: django django-queryset


【解决方案1】:

【讨论】:

  • @almalki 正在计划中,但 SO 要求您等待两天才能接受您自己的答案。不想做任何轻率的事情:)
猜你喜欢
  • 2013-11-23
  • 2013-11-26
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2010-10-27
相关资源
最近更新 更多