Django MySQL按时区按天分组

3
假设我有一个销售模型:
class Sale(models.Model):
    total = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    sale_date = models.DateTimeField(auto_now_add=True)

现在,每次销售时sale_date的值都保存为UTC时间,因此如果我尝试按天对所有销售进行分组和求和:
report = Sale.objects.extra({'day':"date(sale_date)"}).values('day').annotate(day_total=Sum('total'))

我犯了一个错误,因为我希望每天处于一个不同的时区(UTC-6)。

是否有一种方法可以在特定的时区中获得正确的总和?我正在使用MySQL工作。

1个回答

3
Ah,这是一个很好的挑战。我能够从PostGres进行测试,并确认它正在运行。MySQL代码应该非常接近。然而,在CONVERT_TZ文档上有一个注意事项:

要使用命名时区,如METEurope/Moscow,必须正确设置时区表。请参见第10.6节,“MySQL服务器时区支持”,获取指示。

MySQL(使用CONVERT_TZ(dt, from_tz, to_tz)
from_tz = 'UTC'
to_tz = 'Australia/ACT'
report = Sale.objects.extra(
    {
        'day': "date(CONVERT_TZ(sale_date, '{from_tz}', '{to_tz}'))".format(
            from_tz=from_tz,
            to_tz=to_tz
         )
    }
).values(
    'day'
).annotate(
    day_total=Sum('total')
)

PostGres:(使用AT TIME ZONE

time_zone = 'Australia/ACT'
report = Sale.objects.extra(
    {'day': "date(sale_date) AT TIME ZONE '{0}'".format(time_zone)}
).values(
    'day'
).annotate(
    day_total=Sum('total')
)

2
非常好,谢谢!顺便提一下,convert_tz函数也接受时区偏移量作为参数,例如: from_tz="+00:00"to_tz="-06:00" - DenJohX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接