【问题标题】:select data in a time interval in minutes django orm在以分钟为单位的时间间隔中选择数据 django orm
【发布时间】:2022-01-17 14:47:59
【问题描述】:

你好吗?我需要一些帮助。我在 Django 中工作,我需要查询 00:00 到 00:30 分钟之间的所有销售额,所以每 30 分钟我需要查看一次销售额。我正在整理类似的东西,但它不起作用。

sales = (
    SalesOrder
    .objects
    .annotate(Sum('subtotal'))
    .filter(created_at__time__range= ('00:00:00:00', ''))
    .filter(created_at__time = hour_now)
)

这是一个提供正确数据的 SQL 查询。

SELECT sum(subtotal) as tot 
  FROM sales_salesorder ss 
 where extract(minute from created_at::time) between 31 and 59 and
       created_at::date = now()::date and 
       extract(hour from created_at) = extract(hour from CURRENT_TIME);

问题是我不能离开sql查询,因为我必须通过for循环来返回数据,这就是为什么最有效的方法是使用ORM,这就是我提出问题的原因。

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

从您的 sql 到 django 查询的直接翻译是:

from django.utils import timezone

sales = (
    SalesOrder
    .objects
    .filter(created_at__minute__range=(31, 59))
    .filter(created_at__hour=timezone.now().hour)
    .filter(created_at__date=timezone.now().today())
    .count()
)

但是,也许,一个更优雅和索引友好的方法是:

from django.utils import timezone
from datetime import datetime, timedelta

today = datetime.now().today()

date_from = timezone.datetime(
    today.year, today.month, today.day,
    0, 0, 0,
    tzinfo=timezone.get_current_timezone())

date_to = date_from + timedelta(minutes=30)

sales = (
    SalesOrder
    .objects
    .filter(created_at__range=(date_from, date_to))
    .count()
)

如果您希望每半小时分组一次,这里有一个很好的答案:https://stackoverflow.com/a/61747028/842935

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2023-03-07
    • 2021-05-12
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多