如何在日期时间字段中按时间过滤?

Ste*_* H. 7 python django

在模型中,"输入"是日期时间字段.我想查询数据以查找中午(start_time)和下午5:00(end_time)之间的所有条目.

selected = Entry.objects.filter(entered__gte=start_time, entered__lte=end_time)
Run Code Online (Sandbox Code Playgroud)

(正如我所料)我得到一个错误:

"ValidationError: Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
Run Code Online (Sandbox Code Playgroud)

所以我知道我可以使用__year所以我试过了.

selected = Entry.objects.filter(entered__time__gte=start_time, entered__time__lte=end_time)
Run Code Online (Sandbox Code Playgroud)

我得到一个错误:

"FieldError: Join on field 'start' not permitted. Did you misspell 'time' for the lookup type?"
Run Code Online (Sandbox Code Playgroud)

Jar*_*die 6

我不相信有内置的支持,但你可以传递额外的where子句参数(警告:在这里引入DB依赖行为的一些可能性).

例如,在Postgres上,类似于:

Entry.objects.extra(where=['EXTRACT(hour from entered) >= 12 and '\
                    'EXTRACT(hour from entered) < 17'])
Run Code Online (Sandbox Code Playgroud)

如果您使用潜在的不安全输入确定的值12,并17请注意,您还可以指定一个params项额外的,这将确保正确引用和转义,然后使用标准的SQL %s在WHERE语句的占位符.


Vik*_*ica 1

您可以在 python 中进行过滤,而不是使用数据库的机制:

for e in Entry.objects.all():
   if i.entered.hour>= 9 and i.entered.hour < 17 :# or break down to minutes/seconds
        list.append(e)
Run Code Online (Sandbox Code Playgroud)

但我认为这两种解决方案都很丑陋。

史蒂夫,你必须决定,什么对你来说不那么难看:

  • 在for循环中处理大量数据,
  • 或使用 .extra(..) 并绕过 orm 系统

  • 在 django 1.8 中可以按小时/分钟进行过滤:https://docs.djangoproject.com/en/1.8/ref/models/querysets/#hour Entry.objects.filter(entered__hour__gte=9, Entered__hour__lte=17) (2认同)